【问题标题】:how to use do and while loop in haskell如何在haskell中使用do和while循环
【发布时间】:2019-04-03 20:52:02
【问题描述】:

我尝试使用加法并打印每个步骤,但它不起作用,有人可以帮帮我吗?

addition x = x+1
acc_addition xs = do print xs
                     let result = addition xs
                         if result == 5
                            then return ()
                            else do
                                 print result
                                 addition result

【问题讨论】:

  • 你到底想做什么?请注意,Haskell 没有循环。它有递归。
  • 对不起,我不是母语人士,我想做的是这样的:acc_addition 1;然后显示 1;2; 3;4;5
  • do 不是 do-while 循环,它是完全不同的东西。如果您是 Haskell 初学者,我建议您先阅读 Learn You a Haskell
  • 我认为“do 和 while 循环”的措辞很不幸,其本意是“如何使用 'do' 编写这个等效的 while 循环?”,即“我该如何使这个尾递归函数单子?"

标签: loops haskell while-loop do-loops do-notation


【解决方案1】:

您已经很接近了,您只需在最后一步调用acc_addition 而不是addition。从语法上讲,您还需要为您的 let 语句添加一个 in

addition x = x+1
acc_addition xs = do print xs
                     let result = addition xs in
                         if result == 5
                            then return ()
                            else do
                                 print result
                                 acc_addition result

当通过ghci运行时:

*Main> acc_addition 1
1
2
2
3
3
4
4

它打印两次的原因当然是你有两个打印语句。

【讨论】:

  • @AndyTsao:这里还有some minor style suggestions
  • @AndyTsao 一些小问题:在 Haskell 中,如果可能的话,通常会避免使用上述样式。我们不喜欢将纯计算和 IO 混合得超出需要。在这种特定情况下,可以改为编写一个纯函数生成列表[1,2,2,3,3,4,4](使用递归),然后最后打印该列表(for_ myList print)。此外,通常建议从其类型开始编写任何顶级函数,以便让 GHC 产生更好的错误消息。
  • 您也可以取消缩进if,而不是添加in,以与上面的let完全相同的缩进开始。
猜你喜欢
  • 1970-01-01
  • 2021-07-18
  • 2015-07-03
  • 2016-03-27
  • 2012-07-01
  • 2021-07-27
  • 1970-01-01
  • 2020-02-20
  • 2021-05-22
相关资源
最近更新 更多