小编noi*_*oom的帖子

Haskell 如何在这个 do 块中“脱糖” getline ?

我读过一些关于 Haskell 的书,但还没有编写太多代码,而且我对 Haskell 在某种情况下所做的事情有点困惑。假设我正在使用getLine,以便用户可以按一个键继续,但我真的不想以任何有意义的方式解释该人的输入。我相信这是执行此操作的有效方法:

main = do
    _ <- getLine
    putStrLn "foo"
Run Code Online (Sandbox Code Playgroud)

我了解这是在做什么的基本要点。getLine返回一个IO String,并putStrLn接受一个String并返回IO (),所以如果我理论上想打印用户在控制台中输入的内容,我基本上会使用>>=类中的运算符Monad。就我而言,我相信我的代码相当于getLine >> putStrLn "foo"因为我放弃了 的返回值getLine

但是,如果我这样做怎么办?

main = do
    let _ = getLine
    putStrLn "foo"
Run Code Online (Sandbox Code Playgroud)

在本例中,我们正在设置一种 lambda 来处理需要 的东西IO String,对吗?我可以编写一个printIOString函数来打印用户的输入,这样效果就很好。然而,当我实际上没有使用它时IO String,程序的行为很奇怪......getLine甚至不提示我输入;程序只是打印出来"foo"

我不太确定这里的“脱糖”语法是什么,或者这是否会揭示 Haskell 在幕后所做的事情。

monads haskell do-notation

4
推荐指数
1
解决办法
211
查看次数

标签 统计

do-notation ×1

haskell ×1

monads ×1