Haskell では、他の多くの関数型言語と同様に、関数foldl
は次のように定義されfoldl (-) 0 [1,2,3,4] = -10
ます。
foldl (-) 0 [1, 2,3,4]
は、定義により、 であるため、これで問題ありません((((0 - 1) - 2) - 3) - 4)
。
しかし、Racket では2 です。これ(foldl - 0 '(1 2 3 4))
は、Racket が「インテリジェントに」次のように計算するためです: (4 - (3 - (2 - (1 - 0))))
、実際には 2 です。
もちろん、次のように補助関数 Flip を定義すると:
(define (flip bin-fn)
(lambda (x y)
(bin-fn y x)))
次に、Racket で Haskell と同じ動作を実現できます。代わりに、次のように(foldl - 0 '(1 2 3 4))
記述できます。(foldl (flip -) 0 '(1 2 3 4))
問題はfoldl
、なぜラケットでは、他の言語とは異なる、奇妙な (非標準的で直感的でない) 方法で定義されているのでしょうか?