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

时间:2014-06-25 11:37:07

标签: haskell

我的目标是创建函数,该函数接受参数,计算结果并将其返回到元组中并进行修改。

我的第一次尝试看起来像这样:

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

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

如果我将函数cl调用为0且f为

,那么我想要的结果
[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,1]。那更好,但是,我希望通过深度函数递归进行修改。

2 个答案:

答案 0 :(得分:6)

可能你正在寻找

{-# 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]

或更复杂的修改(currying)

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]

答案 1 :(得分:1)

您可以使用iterate

iterate (+1) 0