如何解决关于IO的Haskell练习

时间:2016-12-15 13:02:53

标签: haskell io abstraction

我现在通过做一些我在一些讲师网站上发现的练习,独自学习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 个答案:

答案 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,你也可以给它一些更一般的练习类型。