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。记录语法不会改变任何东西。在函数式编程中:函数是“一等公民”。您可以将它们作为参数传递,作为结果返回,并将它们存储在构造函数中。谢谢,我将看一看:)谢谢,我将看一看:)