我想實現保證導出類似功能集的模塊。什麼是接口的haskell等價物?
爲了舉例:假設我想翻譯一個詞。每個單詞都是從源語言(比如說English
)映射到目標語言(假設爲Spanish
和Russian
)。
我的主應用程序將導入西班牙語和俄語的模型,並選擇默認模型,俄羅斯。我想確保,每個模型有:
- 功能
translateToken :: String -> String
- 所處的具體行爲實現的功能
translatePhrase :: String -> String
。
我該怎麼做?
編輯,關於李的回答是: 如何創建數據類型與包含使用衛士功能記錄語法?
-- let's suppose I want to use a function with guards in a record.
-- how can and should i define that?
data Model = Model { translateToken :: String -> String}
-- idea 1) should I define the functions separately, like this?
-- how do I do this in a way that does not clutter the module?
f l
| l == "foo" = "bar"
main :: IO()
main = print $ translateToken x "foo"
where
x = Model {translateToken=f}
-- idea 2) define the function when creating the record,
-- despite the syntax error, this seems messy:
-- x = Model {name=(f l | l == "foo" = "bar")}
-- idea 3) update the record later
我很好奇,爲什麼鍵入記錄而不是類型類? –
@MichalCharemza因爲當你使用一個用作Java接口的類型'C'時,你很快就會被'C'不是一個類型的事實觸發,並開始定義''''周圍的存在類型'data T = forall t。 C t => T t'。這是一個衆所周知的Haskell [反模式](https://lukepalmer.wordpress.com/2010/01/24/haskell-antipattern-existential-typeclass/)。注意:我大多同意盧克帕爾默的看法,認爲這往往是矯枉過正的,並沒有獲得任何東西的w.r.t.使用帶有功能的基本記錄。然而,在某些特定情況下,我確實認爲「反模式」是合理的。 – chi
@MichalCharemza - 我認爲這種方法更簡單,因爲您不需要爲每個翻譯實例(即'SpanishTranslation','RussianTranslation')創建一個新類型。另一個優點是你可以將記錄放入集合中,並將它們一起操作,這對於類型類別來說很尷尬。我也認爲這更接近於OO語言中接口的使用,其中行爲與接收器而不是類型耦合。 – Lee