使用自定义数据类型在haskell中定义新数据类型

时间:2012-12-17 04:07:59

标签: parsing haskell types

我想知道是否有可能在Haskell中做这样的事情

data Word = Det String | Adj String | Noun String | Verb String | Adverb String
data NounPhrase = Noun | Det Noun

如果我说错了,我想说的是 - “字”是“Det”,“Adj”,“Noun”等等,而“NounPhrase”是“NounPhrase” “或者”Det“后跟”名词“。

当我尝试这样做时,我收到错误:“未定义的类型构造函数”名词“”

我怎样才能解决这个问题,使其表现如上所述。

2 个答案:

答案 0 :(得分:4)

定义代数数据类型时 像

  

data MyType = Con1 String | Con2 Int

然后Con1Con2数据构造函数,它们本身就是 函数Con1 :: String -> MyTypeCon2 :: Int -> MyType。 你的例子有两个问题:

  1. 您对不同类型使用相同的数据构造函数。自数据 构造函数是产生特定类型值的函数,您不能使用 Det 的相同数据构造函数(NounWord)以及NounPhrase。 所以你需要为构造函数选择不同的名称 NounPhrase
  2. Det Noun没有意义,因为Noun是一个数据 构造函数,而Det的参数需要是一个类型,例如String
  3. 请参阅Constructors in Haskell以帮助澄清问题。

答案 1 :(得分:2)

您将混淆类型和值构造函数。当你说

data Word = Det String | Adj String | Noun String | Verb String | Adverb String

您可以将类型 Word定义为多种形式之一,例如

Det String

表示Det构造函数,它接受String并返回值Word的值。 Noun也是如此,它被定义为Words 的构造函数而不是类型。

您可以通过多种方式在Haskell中编码所需的内容。到目前为止最简单的是使用

data Word = Det String | Adj String | Noun String | Verb String | Adverb String
data NounPhrase = JustNoun String | Compound String String

这是“学习Haskell”的方式。它是“串型”,但可能足以满足您的需要。