[英]How to solve a Haskell exercise about IO
現在,我通過做一些講師網站上的練習,獨自學習了Haskell幾個月,但我偶然發現了這個問題,無法解決。
有兩個任務是“連接”的。 我很輕松地解決了第一個問題,但是並不太了解如何做另一個問題。
這是第一個:
練習2。(回想一下Haskell中的IO編程和do表示法)
編寫一個遞歸函數
sumInts :: Integer -> IO Integer
反復從IO讀取整數,直到給出數字0。 此時,函數應返回所有輸入數字的總和加上原始(默認)值,該值作為函數參數給出。
我這樣解決了這個問題:
getInt :: IO Integer
getInt = do
s <- getLine
return (read s)
sumInts :: Integer -> IO Integer
sumInts input = do
x<-getInt
if x==0 then return input else (x+) <$> sumInts input
這很容易做到。 這是另一個,我無法理解的一個:
練習3.將以前的IO交互概括為一個高階函數
whileIO :: IO a -> (a -> Bool) -> (a -> a -> a) -> a -> IO a
對於給定的讀取IO操作,終止條件,折疊功能和原始值,它們將返回所需的IO操作。 檢查是否有一些getIO,condF,foldF值,我們可以將sumInts重新定義為
sumInts = whileIO getIO condF foldF
希望對此有所幫助。 :)
暗示:
嘗試對您的代碼進行泛化,將其片段作為參數,而不是對其進行硬編碼。 例如,將getInt
替換為更通用的getIO
參數。
sumInts :: IO Integer -> Integer -> IO Integer
sumInts getIO input = do
-- ^^^^^
x<-getIO -- <------
if x==0 then return input else (x+) <$> sumInts input
然后將x==0
替換為通用謂詞。
然后使用通用折疊功能替換(x+)
。
等等。
最后,您將獲得所需的whileIO
,還可以為練習提供更通用的類型。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.