haskell - readMaybe的免费版本
问题描述
我想写一个函数来读取一个Int
没有do
符号的函数。它可以工作(见下文),但我想知道它周围的位是否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 步:替换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 替换为其无点等效项,您最终将位于与第 3 步完全相同的位置。
推荐阅读
- python - python regex sub 不会替换所有出现
- yaml - yaml中的双冒号是什么?我在 AWS Cloud Formation 中看到
- python-venv - Venv 和内存使用情况,我应该担心吗?
- javascript - 识别谁触发了函数
- nativescript - Nativescript RadSideDrawer - 任何让它可拖动的方法?
- html - 当光标在顶部并且页面向下滚动时,导航栏幻灯片不会卡住
- nestjs - 如何在 Nestjs 中使用特定于路由的 express 中间件?
- c++ - 使用堆栈查找每个元素的下一个较大值
- swift - 如何使用 FireStore 和 Cloud 功能创建开发环境
- javascript - CSS变换旋转在Internet Explorer 11中不起作用