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

我正在阅读,其中最基本的部分是以下函数,用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 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