2014-06-25 26 views
1

我的目標是創建函數,該函數將參數,計算結果和返回值以元組的形式返回並修改自身。高階函數返回結果並自行修改

我的第一次嘗試是這樣的:

如果我調用函數CL以0和f
f x = (x,f') where 
    f' y = (y+1,f') 

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

我需要的結果是

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

不幸的是,哈斯克爾無法構造無限類型。我很難想出另一種做法。也許,我只是從不好的一面看問題,這就是爲什麼我發佈這個問題。

編輯: 這是我的函數的狀態:

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]。這更好,但是,我想要通過深層函數遞歸進行修改。

+1

你能解釋一下你如何想使用這個功能嗎?這將幫助我們找到解決您的原始問題的方法。 – AndrewC

回答

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] 

或更復雜的修改(鑽營)

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] 
+0

感謝您的幫助,但是,您可以在函數g中返回F修改後的g嗎?這是我想要的核心功能。 – Seraph

+0

@Seraph,每個返回的'g'是「不同的」。你的第一個例子運行良好('h x =(x,g)其中g y =(y + 1,F g)'),讓我寫另一個例子... – josejuan

+0

謝謝,很好的例子。現在我明白我想要什麼了。 – Seraph

1

您可以使用iterate

iterate (+1) 0 
+0

我知道,我測試了我是否可以創建無限數據類型。 – Seraph