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。
我有这个代码:
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。