haskell 返回结果并修改自身的高阶函数

tez616oj  于 12个月前  发布在  其他
关注(0)|答案(2)|浏览(145)

我的目标是创建一个函数,它接受参数,计算结果,并以元组的形式返回修改后的结果。
我的第一次尝试看起来像这样:

f x = (x,f') where
    f' y = (y+1,f') 

cl num func = let (nu,fu) = func num in nu:fu num

字符串
如果我用0和f调用函数cl,我想要的结果是

[0,1,2,3,4,5,6,7,8,9,10,11,12,13 ... infinity]


不幸的是,haskell不能构造无限类型。我很难设计出另一种方法来实现它。也许,我只是从坏的一面看问题,这就是为什么我发布这个问题。
编辑:这是我的功能状态:

newtype InFun = InFun { innf :: Int -> (Int,InFun) }

efunc x = (x,InFun deep) where
    deep y = (y+1, InFun deep)

crli n (InFun f) = let (n',f') = f n in n':crli n f'

main = putStrLn $ show (take 10 (crli 0 (InFun efunc)))


结果是[0,1,1,1,1,1,1,1,1]。这是更好的,但是,我希望通过递归深层函数进行修改。

qmelpv7a

qmelpv7a1#

也许你正在寻找

{-# LANGUAGE RankNTypes #-}

newtype F = F { f :: Int -> (Int, F) }

g y = (y + 1, F g)

字符串
然后

*Main> fst $ (f $ snd $ g 3) 4
5


*Main> map fst $ take 10 $ iterate (\(x, F h) -> h x) (g 0)
[1,2,3,4,5,6,7,8,9,10]


或更复杂的修饰(咖喱化)

h = g False
    where g x y = (y', F g')
                  where y' = if x then y + 1
                                  else 2 * y
                        g' = if x then g False
                                  else g True


然后

*Main> map fst $ take 10 $ iterate (\(x, F h) -> h x) (h 0)
[0,1,2,3,6,7,14,15,30,31]

k2arahey

k2arahey2#

可以使用iterate

iterate (+1) 0

字符串

相关问题