gpt4 book ai didi

haskell - 如何在 Haskell 的 do block 中返回值?

转载 作者:行者123 更新时间:2023-12-02 15:48:40 25 4
gpt4 key购买 nike

我最近才开始学习 Haskell,它是一门非常酷的语言,但我对调用 do block 后如何在函数中“返回”值感到困惑。

具体来说,考虑下面的函数parseMessage

parseMessage :: String -> LogMessage
parseMessage string = do
let brokenLine = words string
let label = take 1 brokenLine
if label == "E" then Error
else if label == "I" then Info
else if label == "W" then Warning
else return Unknown

其中 ErrorInfoWarningLogMessage 类型的三个构造函数。我认为代码有两个问题 - 我都不知道如何解决:

  1. 如何比较两个字符串是否相等?我的做法正确吗?
  2. 如何在if-else语句中“返回”ErrorInfoWarning

此外,我知道我通常可以像这样使用“守卫”:

parseMessage :: String -> LogMessage
parseMessage string
| label == "E" = Error
| label == "I" = Info
| label == "W" = Warning
| otherwise = Unknown

但是我应该在哪里处理

let brokenLine = words string
let label = take 1 brokenLine

抱歉,如果这真的很基本!感谢 advanc3 :))

最佳答案

do block 不用于一般计算。它们用于进行单子(monad)计算。事实上,我对初学者的建议是将 do 视为一个特殊的 IO 事物并且将其用于IO计算。一旦您对 monad 更加熟悉,就可以将其扩展到其他 monadic 上下文。

同样,return 一词不是像其他语言中那样的return 语句。它实际上是 pure 的同义词。函数,它将值包装在最小应用(或者,在 return 的情况下,monadic)上下文中。

但是你并没有在这里做IO。你根本没有做任何单子(monad)的事情。您正在进行普通的纯计算。所以你不需要do

parseMessage :: String -> LogMessage
parseMessage string =
let brokenLine = words string
label = take 1 brokenLine in
if label == ["E"] then Error
else if label == ["I"] then Info
else if label == ["W"] then Warning
else Unknown

我们可以用模式匹配去掉那些 else if

parseMessage :: String -> LogMessage
parseMessage string =
let brokenLine = words string in
case take 1 brokenLine of
["E"] -> Error
["I"] -> Info
["W"] -> Warning
_ -> Unknown

最后,string 是一个 String,所以 brokenLine(被分词后)是一个 [String] . take 有一个前缀,即另一个 [String],所以我想你想要的是 head,它返回第一个元素,不是列表。

parseMessage :: String -> LogMessage
parseMessage string =
let brokenLine = words string in
case head brokenLine of
"E" -> Error
"I" -> Info
"W" -> Warning
_ -> Unknown

如果你也想准备好处理空列表的情况,你可以直接在列表上进行模式匹配

parseMessage :: String -> LogMessage
parseMessage string =
let brokenLine = words string in
case brokenLine of
("E":_) -> Error
("I":_) -> Info
("W":_) -> Warning
_ -> Unknown

关于haskell - 如何在 Haskell 的 do block 中返回值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73295849/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com