了解功能签名

时间:2014-10-30 11:21:21

标签: haskell arguments pattern-matching

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

我的Haskell生锈了。据我所知,fixP接受1个参数,即函数Parser a -> Parser a,其中a被约束为定义了相等。但是,该模式匹配2个参数hxx指的是什么?

涉及的其他类型签名:

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);
    };
}

2 个答案:

答案 0 :(得分:4)

请注意,fixP h的类型为Parser a。由于Parser aState -> Set (a, State)的同义词,我们发现fixP h实际上是一个函数:

(fixP h) :: State -> Set (a, State)

因此,我们可以将此函数应用于x类型的某个参数State。看起来像(fixP h) x。由于function application is left associative(fixP h) xfixP h x相同。

用词语来定义fixP是什么,我们定义它对参数的作用,即我们定义fixP h是什么。由于fixP h本身就是一个函数,我们需要定义它。我们通过指定它对参数的作用来定义它,即我们定义(fixP h) x是什么。函数应用程序的左关联性意味着后者可以写成fixP h x

关于“什么是x?”的问题:它的类型是State,所以它闻起来像某种解析器状态,根据你给出的类型同义词是一个字符串。但是,字符串的作用究竟是什么,仅从类型中看不清楚:)

答案 1 :(得分:1)

简单说明:Parser a是这样的type

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
好吧,好好看看。

相关问题