如何将含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
相关产品推荐
相关产品推荐

