目前我遇到了以下代码,我不知道这个数据构造函数是如何工作的。代码段如下:
data Parser a b = P {
runParser :: Stream a -> [(b, Stream a)]
}
我知道Haskell可以有一些叫做录制语法的东西,但是对于这个,我的想法有点让人感到震惊。
感谢您的帮助。
答案 0 :(得分:3)
基本上这只是常规记录synax:
data Parser a b = P {
runParser :: Stream a -> [(b, Stream a)]
}
这意味着Parser a b
数据类型具有一个数据构造函数。名为P
的数据构造函数,该构造函数具有一个参数:"字段"名为runParser
,该字段的类型为Stream a -> [(b, Stream a)]
。
这种模式在Haskell和函数式编程中很常见。职能是" 头等公民"。这意味着函数可以作为参数传递,函数可以返回另一个函数(事实上由于在Haskell中经常发生这种情况),我们可以在数据构造函数中存储(引用)函数。
例如,我们可以创建一个Parser Int Char
类型:
P (\_ -> []) :: Parser Int Char
所以我们在这里构建了一个Parser Int Char
,并且参数是一个函数,它将任何值映射到一个空列表。
或另一个例子:
P (\x -> [('a', x), ('b', x)]) :: Parser Int Char
这里我们将Stream a
对象x
映射到2元组列表,其中一个以'a'
为第一元素,另一个以'b'
为第一元素。每次我们选择x
作为第二个元素。
或者我们可以定义一个函数,并传递对该函数的引用:
f :: Stream Int -> [(Char, Stream Int)]
f x = [('a', x)]
P f :: Parser Int Char