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 步完全相同的位置。