Pointfree 的情况

Pointfree case of

我有这个代码:

import Control.Lens
import Control.Monad
import Control.Arrow
import Text.Read

... IO (Maybe String) ...
    >>= \m -> case m of
        Just x -> putStrLn x
        Nothing -> putStrLn "Error"

是否可以让它成为 pointfree(去掉 \m ->)?

有几种方法。在这种特殊情况下:

putStrLn . fromMaybe "Error"

但这是一个非常特殊的案例。稍微不那么特别的是使用 Maybe 变形:

maybe (putStrLn "Error") putStrLn

Haskell 中的许多类型都带有类似的变形,可以用来避免 case。但最常见的情况是使用称为 LambdaCase 的特殊语言扩展,它可以让您编写

\case
    Just x  -> putStrLn x
    Nothing -> putStrLn "Error"

不同于fromMaybe(这对Maybe和这里使用的案例的规律性来说是特殊的)或变形(对于提供这种情况的类型来说是特殊的),这可以用来匿名化任何模式匹配的 lambda。