readMaybe的免费版本



我想写一个函数来读取没有do表示法的Int。它是有效的(见下文(,但我想知道readMaybe周围的部分是否可以用无点形式写(或者用其他方式清理一下(?

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

步骤1:用其无点等价物替换lambda:

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:用m >>= g . f:替换f <$> m >>= g

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,就可以在与步骤3完全相同的位置结束。

最新更新