我的目标是创建函数,该函数接受参数,计算结果并将其返回到元组中并进行修改。
我的第一次尝试看起来像这样:
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]。那更好,但是,我希望通过深度函数递归进行修改。
答案 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