具有某种函数头问题的Haskell数据构造函数?

时间:2018-06-04 15:49:37

标签: haskell

目前我遇到了以下代码,我不知道这个数据构造函数是如何工作的。代码段如下:

data Parser a b = P {
  runParser :: Stream a -> [(b, Stream a)]
}

我知道Haskell可以有一些叫做录制语法的东西,但是对于这个,我的想法有点让人感到震惊。

感谢您的帮助。

1 个答案:

答案 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