什么是接口的haskell等价物?

时间:2017-03-14 11:36:09

标签: haskell design-patterns interface

我想实现保证导出类似功能集的模块。

为了举个例子:假设我想翻译一个单词。每个单词都是从源语言(比方说English)映射到目标语言(比方说SpanishRussian)。

我的主要应用程序将导入西班牙语和俄语的模型,并选择默认模型,俄语。我想保证,每个型号都有:

  • 一个函数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

3 个答案:

答案 0 :(得分:15)

您可以创建包含所需功能的类型。

data Model = Model { translateToken :: String -> String,
                     translatePhrase :: String -> String }

然后为西班牙语和俄语创建价值。

答案 1 :(得分:2)

那将是类型类。来自Learn You a Haskell: "类型类更像接口。 "

您定义了自己的类型类(未经测试):

  class Translation a where
    translateToken :: a -> String -> String
    translatePhrase :: a -> String -> String

并将其实现为

  instance Translation Spanish where
     translateToken = spanishTranslateToken
     translatePhrase = spanishTranslatePhrase

另见Real Word Haskell on typeclasses

答案 2 :(得分:-3)

A class,有时也称为“类型类”。不要把它与你常用的OO类混淆,但Haskell类没有数据,并且通常没有实现(通用默认值除外)。