gpt4 book ai didi

haskell - 在 Haskell 中用(广义的)箭头写阶乘

转载 作者:行者123 更新时间:2023-12-02 01:49:21 24 4
gpt4 key购买 nike

我想在 Haskell 的 (->) 箭头中写一个阶乘。我不知道如何将递归转换为 loop。我已经成功地使用 loop 为我的阶乘创建了一个固定点,但现在 lambda 抽象出现了问题,我无法翻译它。

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

有一个 article在另一个转换流的箭头中写阶乘:[a] -> [b],但我不感兴趣。我正在寻找的是更多 like that .

如何在 (->) 箭头中写阶乘?

最佳答案

这是 Haskell 箭头表示法中阶乘函数的等效递归定义。

fact :: Integer -> Integer
fact = proc b -> do
rec
c <- f -<< b
f <- g -< f
returnA -< c

g :: (Integer -> Integer) -> Integer -> Integer
g f x = if x == 0 then 1 else x * f (x-1)

递归 block 的第二行表明阶乘函数是g 的不动点这一事实。 .第一行,高阶箭头应用-<<f 起需要也是 block 内的箭头。该行也可以写成

c <- app -< (f,b)

目前尚不清楚是否可以通过仅定义数据(即没有高阶箭头应用程序)以递归箭头表示法进行定义。

关于haskell - 在 Haskell 中用(广义的)箭头写阶乘,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23807637/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com