我现在通过做一些我在一些讲师网站上发现的练习,独自学习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
会喜欢这个帮助。 :)
答案 0 :(得分: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
,你也可以给它一些更一般的练习类型。