1

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

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

如果我说错了,我想说的是-“单词”是“Det”、“Adj”、“名词”等,而“NounPhrase”是“名词”或“Det”后跟一个“名词”。

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

我怎样才能做到这一点,以便它按上述方式执行。

4

2 回答 2

4

当您定义代数数据类型时

数据 MyType = Con1 字符串 | CON2 诠释

thenCon1Con2数据构造函数,它们本身是函数Con1 :: String -> MyTypeCon2 :: Int -> MyType. 您的示例有两个问题:

  1. 您对不同类型使用相同的数据构造函数。由于数据构造函数是产生特定类型值的函数,因此不能使用相同的数据构造函数(DetNoun) forWord for NounPhrase。所以你需要为 NounPhrase.
  2. Det Noun没有意义,因为Noun它是一个数据构造函数,而 的参数Det需要是一个类型,例如String.

请参阅Haskell 中的构造函数以帮助解决问题。

于 2012-12-17T05:02:34.357 回答
2

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

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

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

Det String

说这Det是一个构造函数,它接受 aString并返回一个 type 的值Word。同样,Noun它被定义为 Words 的构造函数而不是类型。

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

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

这就是“学习 Haskell”的方式。它是“字符串类型的”,但可能足以满足您的目的。

于 2012-12-17T04:41:18.567 回答