我正在阅读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个参数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);
};
}
答案 0 :(得分:4)
请注意,fixP h
的类型为Parser a
。由于Parser a
是State -> Set (a, State)
的同义词,我们发现fixP h
实际上是一个函数:
(fixP h) :: State -> Set (a, State)
因此,我们可以将此函数应用于x
类型的某个参数State
。看起来像(fixP h) x
。由于function application is left associative,(fixP h) x
与fixP 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
好吧,好好看看。