2016-12-15 16 views
1

我现在通过在一些讲师网站上发现的一些练习,已经学习了几个月的Haskell,而我偶然发现了这个练习并且无法解决如何解决它。如何解决关于IO的Haskell练习

有两个任务有点“连接”。我很轻松地解决了第一个问题,但不太了解如何去做另一个问题。

这里的第一个:

练习2(在Haskell召回IO编程和做记号)

写递归函数

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 

很想一些帮助,这一个。 :)

+1

,而不是'(X +)<$> sumInts input',你可以只是做'sumInts(X +输入)'。 ---“折叠”是指“积累”顺便说一句。 –

+0

或者你可以完全删除'input'参数,用0代替基本情况,并在递归情况下写'sum(x +)<$> sumInts'。当然,因为问题规范要求您接受输入,所以您必须在'go'辅助功能或类似内容中执行我的建议。 – amalloy

回答

2

提示:

尝试概括你的代码,使得它的一部分作为参数,而不是硬编码他们。例如,将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,你也可以给它通过行使建议的更普遍的类型。

+0

感谢您的提示,我现在就试试看。我仍然不会将它标记为已回答,但我还没有结束!谢谢你。 – iWanabi