点免费monadic表达

时间:2014-07-20 06:03:21

标签: haskell

考虑这个表达式(取自Real World Haskell第8章,我试图简化)

isElfFile :: FilePath -> IO Bool
isElfFile path = return . hasElfMagic =<< L.readFile path

如何制作此功能的无点版本?我尝试使用其他绑定操作>>=,解除hasElfMagic,但似乎都没有。

1 个答案:

答案 0 :(得分:8)

这里更简单,没有约束力:

isElfFile path = return . hasElfMagic =<< L.readFile path
isElfFile path = fmap hasElfMagic (L.readFile path)
isElfFile      = fmap hasElfMagic . L.readFile 

但当然也可以使用=<<

isElfFile path = return . hasElfMagic =<< L.readFile path
isElfFile path = (=<<) (return . hasElfMagic) (L.readFile path)
isElfFile      = (=<<) (return . hasElfMagic) . L.readFile
isElfFile      = (return . hasElfMagic =<<) . L.readFile

通常,在尝试使点无效之前,将中缀函数转换为前缀形式是有帮助的。