gpt4 book ai didi

haskell - 为什么我不能使用 (cnt <- hGetContents h) 表达式而不是 cnt?

转载 作者:行者123 更新时间:2023-12-01 08:55:39 26 4
gpt4 key购买 nike

我学习 Haskell。它工作正常:

import System.IO

main = do
h <- openFile "text.txt" ReadMode
cnt <- hGetContents h
mapM_ putStrLn $ lines cnt
hClose h

但这不起作用:

import System.IO

main = do
h <- openFile "text.txt" ReadMode
mapM_ putStrLn $ lines (cnt <- hGetContents h)
hClose h

为什么我的第二个变体不起作用?我希望这两种变体是相等的,因为 (cnt <- hGetContents h)是一个表达式,也返回值。

最佳答案

问题是cnt <- hGetContents h 不是表达式,它是do notation 中的一些特殊语法糖.这意味着它是编写以下普通 Haskell 代码的不同方式:

hGetContents h >>= \ cnt -> {- rest of do block -}

{- rest of the do block -} 之前的部分这里不是一个完整的表达式,因为完成 lambda 的主体需要 do block 的其余部分。

您可以手动对其进行脱糖以获取如下内容:

hGetContents h >>= \ cnt -> mapM_ putStrLn (lines cnt)

或免积分版

hGetContents h >>= mapM_ putStrLn . lines

您可以看出它是一个特殊的表达式,因为它引入了一个新标识符 (cnt),您可以在表达式本身之外的其余代码中使用该标识符。这不是普通的 Haskell 表达式可以做的事情(至少没有编译时魔法)。

关于haskell - 为什么我不能使用 (cnt <- hGetContents h) 表达式而不是 cnt?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27909405/

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