You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将含do和<-的Haskell代码改写为不使用这两个语法的单行代码?

如何将含do和<-的Haskell代码改写为不使用这两个语法的单行代码?

嘿,这个问题其实很好解决,关键是搞懂Haskell里do语法和<-符号的本质——它们都是Monad操作的语法糖而已。

先看你给出的原代码:

foo = do
  str <- readFile "foo"
  writeFile "bar" str

这段代码的逻辑是:先读取foo文件的内容,把内容绑定到str变量,再把str的内容写入bar文件。

要去掉do和<-,我们可以直接用Monad的绑定操作符>>=(读作“bind”)来实现。因为readFile "foo"返回的是IO String类型,而writeFile "bar"是一个String -> IO ()的函数,刚好可以通过>>=把前者的结果传递给后者,所以可以简化成这样的单行代码:

foo = readFile "foo" >>= writeFile "bar"

简单解释下:>>=的作用就是把前一个IO操作的结果,传给后面那个接受该结果的IO函数。这里readFile "foo"拿到的字符串,直接被传给writeFile "bar"作为第二个参数,完全等价于原do块的逻辑。

如果想更直白一点,也可以写成带lambda的形式(不过上面的简化版更简洁):

foo = readFile "foo" >>= \str -> writeFile "bar" str

这个版本和原do块的对应关系更明显,lambda里的str就对应原代码中<-绑定的变量,不过因为writeFile "bar"本身就接受一个字符串参数,所以lambda可以省略,直接传递函数就行。

备注:内容来源于stack exchange,提问作者Roman Micuda

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.23 14:02:38