3

(->)Haskell でアローの階乗を書きたいと思います。再帰を に変換する方法がわかりませんlooploop階乗の修正点を作成するために使用できましたが、ラムダ抽象化に問題があり、翻訳できません。

loop f b = let (d, c) = f (d, b) in c
g = \(f, x) -> (\x -> if x == 0 then 1 else x * f (x - 1), f x)
main = print $ loop g 5

ストリームを変換する別の矢印で階乗を書くことに関する記事があります: [a] -> [b]、しかしそれは私が興味を持っているケースではありません.私が探しているのはそのようなものです.

(->)階乗を矢印で書くにはどうすればよいですか?

4

2 に答える 2

1

1 つの可能性は、最初に再帰を using に変換し、次にusing をfix実装することです。fixloop

import Control.Arrow

fix :: (a -> a) -> a
fix = loop (\(f, x) -> let x' = f x in (x', x'))

または矢印表記を使用してポイントフリー:

fix = loop (uncurry ($) >>> (id &&& id))
于 2014-07-17T20:29:38.317 に答える