我想写一个函数来读取没有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完全相同的位置结束。