haskell - 如何在do块中读取文件
问题描述
我正在学习 Haskell,并试图弄清楚为什么我在以下代码中出现错误。我正在尝试定义一个可以在给定位置读取文件并对其执行某些功能的函数,但它有一个错误,我担心我无法理解。
我想我在做一些愚蠢的事情,但我不知道是什么;有人可以告诉我吗?
readAndProcessFile :: String -> (String -> a) -> a
readAndProcessFile l f = do
contents <- readFile l -- error here
let result = f contents
return result
我得到错误:
发生检查:无法构造无限类型:a~IO a
在“do”块的 stmt 中:内容 <- readFile l
在表达式中:
do contents <- readFile l
let result = (f contents)
return result
在“readAndProcessFile”的等式中:
readAndProcessFile l f
= do contents <- readFile l
let result = ...
return result
• 相关绑定包括
f :: String -> a
readAndProcessFile :: String -> (String -> a) -> a
解决方案
的类型readAndProcessFile
是String -> (String -> a) -> IO a
。事实上,你使用了一个do
块,这意味着它是一元的。你这里基本上写的是readFile >>= \contents -> let result = f contents in return result
. 此外,它readFile
专门用于一个IO
.
您可以通过使用来简化表达式<$> :: Functor f => (a -> b) -> f a -> f b
readAndProcessFile :: FilePath -> (String -> a) -> IO a
readAndProcessFile l f = f <$> readFile l
推荐阅读
- charts - Highcharts 为水墙和堆栈柱形图创建图例
- javascript - Angular mat-table 重置数据源而不重置页面
- python - 当我使用 BeautifulSoup 从该网站上抓取价格时,为什么当我按下检查时输出与 html 代码不匹配?
- kubernetes - 如何保持 redis 数据库 pod 在 kubernetes 中运行
- performance-testing - 如何使用 Gatling 在封闭模型中实现恒定的并发活跃用户?
- python - 如何将空 numpy 数组返回为 np.ndarray([[[]]])
- powershell - 如何在页面上导出webpart的xml
- python - 了解 Python asyncio 中事件循环的实现
- c++ - C++ 中的 VLA,扩展名为 std=c++11
- angular - Ionic Web 应用程序页面未使用 Ingress Controller 打开