首页 > 解决方案 > readMaybe的免费版本

问题描述

我想写一个函数来读取一个Int没有do符号的函数。它可以工作(见下文),但我想知道它周围的位是否readMaybe可以以无点形式编写(或以其他方式清理一下)?

main :: IO ()
main = getLine >>= (\x -> return $ (readMaybe x :: Maybe Int)) >>= print 

标签: haskellmonadspointfree

解决方案


第 1 步:将 lambda 替换为其无点等效项:

main :: IO ()
main = getLine >>= return . (readMaybe :: String -> Maybe Int) >>= print

第 2 步:替换m >>= return . ff <$> m

main :: IO ()
main = (readMaybe :: String -> Maybe Int) <$> getLine >>= print

第 3 步:替换f <$> m >>= gm >>= 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 >>= gm >>= \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 >>= ff x(左身份):

main :: IO ()
main = getLine >>= \x -> print ((readMaybe :: String -> Maybe Int) x)

现在只需将新的 lambda 替换为其无点等效项,您最终将位于与第 3 步完全相同的位置。


推荐阅读