Haskell 理解函数签名
我正在阅读,其中最基本的部分是以下函数,用Haskell编写:Haskell 理解函数签名,haskell,arguments,pattern-matching,Haskell,Arguments,Pattern Matching,我正在阅读,其中最基本的部分是以下函数,用Haskell编写: fixP :: Eq a => (Parser a -> Parser a) -> Parser a fixP h x = fixS f where f s = h p x where p y = if x == y then s else fixP h
fixP :: Eq a => (Parser a -> Parser a) -> Parser a
fixP h x = fixS f
where f s = h p x
where p y = if x == y then s
else fixP h y
我的哈斯克尔生锈了。据我所知,fixP
接受一个参数,它是一个函数Parser a->Parser a
,其中a
被约束为定义了等式。但是,模式匹配两个参数,h
和x
。x
指的是什么
涉及的其他类型签名:
type Parser a = State -> Set (a,State)
type State = String
type Set a = [a]
fixS :: Eq a => (Set a -> Set a) -> Set a
在阅读和理解答案后,为感兴趣的任何人提供帮助;下面是用javascript编写的相同函数:
function fixP(h) {
return function(x) {
var f = function(s) {
var p = function(y) {
if(x == y) {
return s;
} else {
return fixP(h)(y);
}
};
return h(p)(x);
};
return fixS(f);
};
}
简单解释:
解析器a
是一种类型
,如下所示:
type Parser a = (String -> a)
那么这个代码呢
模块主要在哪里
type NT a = (Int -> a)
f :: (NT a -> NT a) -> NT a
f h x = undefined
g :: NT Double
g 0 = 0.0
g _ = 1.0
main = undefined
类型检查良好。注意
fixph
具有类型解析器a
。由于Parser a
是State->Set(a,State)
的同义词,我们看到fixP h
实际上是一个函数:
(fixP h) :: State -> Set (a, State)
因此,我们可以将此函数应用于State
类型的某个参数x
。看起来像是(fixP h)x
。因为,(fixP h)x
与fixP h x
相同
换句话说:为了定义什么是fixP
,我们定义它对参数的作用,即定义什么是fixph
。因为fixph
本身就是一个函数,所以我们需要定义它。我们通过指定它对参数的作用来定义它,即定义(fixP h)x
是什么。函数应用程序的左关联性意味着后者可以写入fixP hx
至于“x是什么?”这个问题:它的类型是
State
,所以它闻起来像某种解析器状态,根据您给出的类型同义词,它是一个字符串。但是,仅仅从类型来看,这个字符串的作用并不明确:)可能是解析器a
一种函数类型(我的意思是类型解析器a=Something->a
,或者类似的类型)?由于fixP h
具有类型解析器a
,因此它本身将是一个函数,因此它可以接受x
@gspr。我已经用所有涉及的类型签名回答了我的问题。对,您的编辑将清除所有内容。由于type Parser a=State->Set(a,State)
,因此fixph
的类型是State->Set(a,State)
。现在您可以看到它实际上是一个函数,因此将参数传递给它是有意义的,即当x::State
时谈论(fixP h)x
。函数应用程序的关联性使得这与fixP h x
@gspr相同。您介意将其作为一个答案,也许更详细一点,以便我可以接受吗?好的。如果您希望进一步升级,请告诉我。嗨。您是否介意再详细解释一下,或者回答最初的问题“x指的是什么?”。提前感谢。x
指的是State