【问题标题】:Do loops in Haskell在 Haskell 中做循环
【发布时间】:2022-12-06 12:13:56
【问题描述】:

在 Haskell 中,当您在列表的 do 循环中使用 <- 时,它会返回整个列表吗?

所以:

        do
      //some code
         c <-[1..4]
        //some code

c 会是 [1,2,3,4] 吗?

【问题讨论】:

  • Haskell doesn't have loops。我想你还没有动脑子猛烈地颠倒由 Haskell 及其 FP 范式(别担心,它在某些时候发生在我们所有人身上)。 (过度简化警告:Haskell 没有描述如何一个程序工作,而不是它描述什么它确实)。
  • The do keyword in Haskell describes a monad(这是只执行一次的操作序列,这就是它用于 IO 的原因)。它与 C 系列语言的 while/do 循环完全无关。
  • @Dai 我的意思是,这并非完全无关。 do {x &lt;- [1..4]; pure (x + 1)} 的计算结果为 [2,3,4,5]。列表是一个 monad,所以你可以用 do if m ~ [] 循环。
  • 你能显示do之前的几行吗?
  • 我最喜欢的 monad 解释是“可编程分号”。此行仅在您使用“列表分号模式”(又名Listmonad) 这是一种在所有列表元素上单独运行代码的模式。

标签: haskell


【解决方案1】:

为什么要问我们什么时候可以请口译员?

Leaving GHCi.
tommd@pop-os ~% ghci
GHCi, version 8.10.7: https://www.haskell.org/ghc/  :? for help
Loaded package environment from /home/tommd/.ghc/x86_64-linux-8.10.7/environments/default
iPrelude> import Debug.Trace
Prelude Debug.Trace> :{
Prelude Debug.Trace| do
Prelude Debug.Trace| c <- [1..4]
Prelude Debug.Trace| trace ("C is currently: " ++ show c) (return c)
Prelude Debug.Trace| :}
C is currently: 1
[1C is currently: 2
,2C is currently: 3
,3C is currently: 4
,4]

请注意,输出与跟踪消息交织在一起,因此您可以看到 c 在列表 monad 中一次获取 14 的值。

如果“在列表 monad 中”的最后一部分不是很明显,那么不要忽略它——这是理解这个答案的关键部分,以及它如何(和不能)应用于您对 Haskell 语言的使用。

【讨论】:

    猜你喜欢
    • 2016-06-08
    • 1970-01-01
    • 2013-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-20
    • 2015-01-01
    • 1970-01-01
    相关资源
    最近更新 更多