无点案例

242*_*684 4 haskell pointfree

我有这个代码:

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"
Run Code Online (Sandbox Code Playgroud)

是否有可能使它无点(摆脱\m ->)?

Dan*_*ner 9

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

putStrLn . fromMaybe "Error"
Run Code Online (Sandbox Code Playgroud)

但这是一个非常特殊的情况.稍微不那么特别的是使用Maybecatamorphism:

maybe (putStrLn "Error") putStrLn
Run Code Online (Sandbox Code Playgroud)

Haskell中的许多类型具有类似的可以用来避免的类似物case.但最常见的情况是使用称为的特殊语言扩展LambdaCase,它允许您编写

\case
    Just x  -> putStrLn x
    Nothing -> putStrLn "Error"
Run Code Online (Sandbox Code Playgroud)

fromMaybe(Maybe这里使用的案例的特殊性和规则性)或者catamorphism(对于提供一个的类型特殊)不同,这可以用于匿名化任何模式匹配的lambda.