Nat*_*ell 0 haskell algebraic-data-types
我正在Haskell中编写一些数据类型来表示正式的英语语法.
data S = NP VP
Run Code Online (Sandbox Code Playgroud)
到目前为止,句子只是名词短语和动词短语.惊叹于代数数据类型的优雅之美!
我还将一个限定词和形容词定义为:
data D = A | An | The
type Adj = String -- Too many adjectives for me to list, so I make it a type
-- synonym for String.
Run Code Online (Sandbox Code Playgroud)
现在,我遇到了定义NP的问题,这是一个带有可选限定词和形容词的名词.我的第一个天生本能是使用Maybe:
data NP = Maybe D Maybe Adj N
Run Code Online (Sandbox Code Playgroud)
这给了我错误:
Expecting one more argument to `Maybe' In the type `Maybe' In the definition of data
constructor `Maybe' In the data type declaration for `NP'
Run Code Online (Sandbox Code Playgroud)
(请注意,根据我是否导入了Data.Maybe,错误不会改变)
我使用它的唯一方法是使用记录语法:
data NP' = NP' {determiner :: Maybe D, adjective :: Maybe Adj, noun :: N}
Run Code Online (Sandbox Code Playgroud)
为什么这只在我使用记录语法时才有效?
尝试
data NP = NP (Maybe D) (Maybe Adj) N
Run Code Online (Sandbox Code Playgroud)
你需要
NPMaybe通过用括号消除歧义,仅应用我所做的一个参数