Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/react-native/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell数据构造函数是否存在某种函数头问题?_Haskell - Fatal编程技术网

Haskell数据构造函数是否存在某种函数头问题?

Haskell数据构造函数是否存在某种函数头问题?,haskell,Haskell,目前我遇到了以下代码,我不知道这个数据构造函数是如何工作的。代码片段如下所示: data Parser a b = P { runParser :: Stream a -> [(b, Stream a)] } 我知道Haskell可以有一个叫做录制语法的东西,但对于这一个,这有点让我大吃一惊 感谢您的帮助。基本上这只是常规记录synax: data Parser a b = P { runParser :: Stream a -> [(b, Stream a)] } 因此,

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

data Parser a b = P {
  runParser :: Stream a -> [(b, Stream a)]
}
我知道Haskell可以有一个叫做录制语法的东西,但对于这一个,这有点让我大吃一惊


感谢您的帮助。

基本上这只是常规记录synax:

data Parser a b = P {
  runParser :: Stream a -> [(b, Stream a)]
}
因此,这里我们构造了一个
解析器Int Char
,参数是一个函数,它将任何值映射到一个空列表

或者另一个例子:

P (\x -> [('a', x), ('b', x)]) :: Parser Int Char
因此,这里我们将
流a
对象
x
映射到一个2元组列表,一个元组以
'a'
作为第一个元素,另一个元组以
'b'
作为第一个元素。每次我们选择
x
作为第二个元素

或者我们可以定义一个函数,并传递对该函数的引用:

f :: Stream Int -> [(Char, Stream Int)]
f x = [('a', x)]

P f :: Parser Int Char

基本上这只是常规记录synax:

data Parser a b = P {
  runParser :: Stream a -> [(b, Stream a)]
}
因此,这里我们构造了一个
解析器Int Char
,参数是一个函数,它将任何值映射到一个空列表

或者另一个例子:

P (\x -> [('a', x), ('b', x)]) :: Parser Int Char
因此,这里我们将
流a
对象
x
映射到一个2元组列表,一个元组以
'a'
作为第一个元素,另一个元组以
'b'
作为第一个元素。每次我们选择
x
作为第二个元素

或者我们可以定义一个函数,并传递对该函数的引用:

f :: Stream Int -> [(Char, Stream Int)]
f x = [('a', x)]

P f :: Parser Int Char

具体哪一部分你在理解上有问题?这里有很多事情要做,对这一切的概述太宽泛了。你看过记录是如何工作的吗?@Carcigenicate Stream a->[(b,Stream a)]这是不是意味着如果我在ghci中键入
:t runParser
,我将得到
Parser a b->Stream a->[(b,Stream a)]
?你试过了吗?而
流a->[(b,流a)]
是一个函数,它接受一个流,并返回一个元组列表,其中第一个元素的类型为b,第二个元素的类型为a。记录语法不会改变任何东西。在函数式编程中:函数是“一等公民”。您可以将它们作为参数传递,作为结果返回,并将它们存储在构造函数中。您在理解哪一部分时遇到问题?这里有很多事情要做,对这一切的概述太宽泛了。你看过记录是如何工作的吗?@Carcigenicate Stream a->[(b,Stream a)]这是不是意味着如果我在ghci中键入
:t runParser
,我将得到
Parser a b->Stream a->[(b,Stream a)]
?你试过了吗?而
流a->[(b,流a)]
是一个函数,它接受一个流,并返回一个元组列表,其中第一个元素的类型为b,第二个元素的类型为a。记录语法不会改变任何东西。在函数式编程中:函数是“一等公民”。您可以将它们作为参数传递,作为结果返回,并将它们存储在构造函数中。谢谢,我将看一看:)谢谢,我将看一看:)