readMaybe免点版
Point free version for readMaybe
我想编写一个函数来读取没有 do
符号的 Int
。它有效(见下文),但我想知道 readMaybe
周围的位是否可以用点自由形式编写(或以其他方式清理一下)?
main :: IO ()
main = getLine >>= (\x -> return $ (readMaybe x :: Maybe Int)) >>= print
第 1 步:将 lambda 替换为它的 pointfree 等价物:
main :: IO ()
main = getLine >>= return . (readMaybe :: String -> Maybe Int) >>= print
第 2 步:将 m >>= return . f
替换为 f <$> m
:
main :: IO ()
main = (readMaybe :: String -> Maybe Int) <$> getLine >>= print
第 3 步:将 f <$> m >>= g
替换为 m >>= g . f
:
main :: IO ()
main = getLine >>= print . (readMaybe :: String -> Maybe Int)
第 4 步:使用类型应用程序而不是写出长而笨拙的类型:
{-# LANGUAGE TypeApplications #-}
main :: IO ()
main = getLine >>= print . readMaybe @Int
作为在第 2 步和第 3 步中使用 <$>
的替代方法,您可以只使用 monad 法则来完成相同的操作,就像这样(在第 1 步之后开始):
将m >>= f >>= g
替换为m >>= \x -> f x >>= g
(关联性):
main :: IO ()
main = getLine >>= \x -> (return . (readMaybe :: String -> Maybe Int)) x >>= print
将.
简化为:
main :: IO ()
main = getLine >>= \x -> return ((readMaybe :: String -> Maybe Int) x) >>= print
将return x >>= f
替换为f x
(左标识):
main :: IO ()
main = getLine >>= \x -> print ((readMaybe :: String -> Maybe Int) x)
现在只需将新的 lambda 替换为它的 pointfree 等价物,您最终就会到达与第 3 步完全相同的位置。
我想编写一个函数来读取没有 do
符号的 Int
。它有效(见下文),但我想知道 readMaybe
周围的位是否可以用点自由形式编写(或以其他方式清理一下)?
main :: IO ()
main = getLine >>= (\x -> return $ (readMaybe x :: Maybe Int)) >>= print
第 1 步:将 lambda 替换为它的 pointfree 等价物:
main :: IO ()
main = getLine >>= return . (readMaybe :: String -> Maybe Int) >>= print
第 2 步:将 m >>= return . f
替换为 f <$> m
:
main :: IO ()
main = (readMaybe :: String -> Maybe Int) <$> getLine >>= print
第 3 步:将 f <$> m >>= g
替换为 m >>= g . f
:
main :: IO ()
main = getLine >>= print . (readMaybe :: String -> Maybe Int)
第 4 步:使用类型应用程序而不是写出长而笨拙的类型:
{-# LANGUAGE TypeApplications #-}
main :: IO ()
main = getLine >>= print . readMaybe @Int
作为在第 2 步和第 3 步中使用 <$>
的替代方法,您可以只使用 monad 法则来完成相同的操作,就像这样(在第 1 步之后开始):
将m >>= f >>= g
替换为m >>= \x -> f x >>= g
(关联性):
main :: IO ()
main = getLine >>= \x -> (return . (readMaybe :: String -> Maybe Int)) x >>= print
将.
简化为:
main :: IO ()
main = getLine >>= \x -> return ((readMaybe :: String -> Maybe Int) x) >>= print
将return x >>= f
替换为f x
(左标识):
main :: IO ()
main = getLine >>= \x -> print ((readMaybe :: String -> Maybe Int) x)
现在只需将新的 lambda 替换为它的 pointfree 等价物,您最终就会到达与第 3 步完全相同的位置。