编写函数,很容易混淆返回类型。如果函数有副作用,必须用 return 返回类型。从有副作用的函数”取值“,必须用 <- 。另外 return 后面如果有复杂表达式,还是用括号扩起来吧,因为 return 和后面符号结合的优先级很高,不小心就出现符号结合顺序的错误。
sequence' [] = return [] sequence' (x:xs) = do a <- xb <- sequence' xsreturn (a : b)mapM' :: (a -> (IO ())) -> [a] -> (IO ())
mapM' x [] = return () mapM' x (y:ys) = dox ymapM' x ysreturn ()forever' x = do xforever' x
亲自编写这些库函数有两个好处,一是对这些函数的作用理解更深,其次,对于理解 Haskell 语法、语义非常有帮助。