是否有可能在Haskell中编写Y Combinator ? 它似乎会有一个无限的recursiontypes。 Y :: f -> b -> c where f :: (f -> b -> c) 或者其他的东西。 即使是一个简单的因子 factMaker _ 0 = 1 factMaker fn n = n * ((fn fn) (n -1) {- to be called as (factMaker factMaker) 5 -} “发生检查:不能构造无限types:t = t – > t2 – > t1” (Y组合器看起来像这样 […]
在几乎所有的例子中,ML型语言中的一个y-combinator是这样写的: let rec yfx = f (yf) x let factorial = y (fun f -> function 0 -> 1 | n -> n * f(n – 1)) 这可以像预期的那样工作,但是使用let rec …来定义y-combinator感觉就像是在作弊。 我想定义这个组合子,而不使用recursion,使用标准的定义: Y = λf·(λx·f (xx)) (λx·f (xx)) 直接翻译如下: let y = fun f -> (fun x -> f (xx)) (fun x -> f (xx));; 但是,F#抱怨说,它无法弄清楚types: […]
我对fix的文档有点困惑(尽pipe我想我明白它现在应该做什么),所以我查看了源代码。 这让我更加困惑: fix :: (a -> a) -> a fix f = let x = fx in x 这究竟是如何返回一个固定的点? 我决定尝试在命令行: Prelude Data.Function> fix id … 它挂在那里。 现在公平地说,这是我的旧的macbook,这是慢的。 然而,这个函数的计算花费不算太高,因为任何传递给id的东西都会返回相同的结果(更不要说它没有CPU时间了)。 我究竟做错了什么?
所以我花了很多时间阅读和重读The Little Schemer第9章的结尾,其中适用的Y组合器是为“长度”函数而开发的。 我认为我的困惑归结为一个单一的陈述,对比两个版本的长度(在组合因子被排除之前): A: ((lambda (mk-length) (mk-length mk-length)) (lambda (mk-length) (lambda (l) (cond ((null? l) 0 ) (else (add1 ((mk-length mk-length) (cdr l)))))))) B: ((lambda (mk-length) (mk-length mk-length)) (lambda (mk-length) ((lambda (length) (lambda (l) (cond ((null? l) 0) (else (add1 (length (cdr l))))))) (mk-length mk-length)))) (第四版)指出,A“在我们将它应用于参数时返回一个函数”,而B“不返回函数”,从而产生自我应用的无限回归。 我被这个难住了 如果B被这个问题困扰,我不会看到A如何避免它。
一个普通的函数可以在其定义中包含对自身的调用,没有问题。 我不知道如何使用lambda函数来做到这一点,虽然简单的理由是,lambda函数没有名称可以返回。 有没有办法做到这一点? 怎么样?