簡體   English   中英

如何解決有關IO的Haskell練習

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM