我正在学习 Haskell,并试图弄清楚为什么我在以下代码中遇到错误。我正在尝试定义一个函数,该函数可以读取给定位置的文件,并对其执行一些函数,但它有一个错误,恐怕我无法理解。
我想我正在做一些愚蠢的事情,但我不知道是什么;有人可以告诉我吗?
readAndProcessFile :: String -> (String -> a) -> a
readAndProcessFile l f = do
contents <- readFile l -- error here
let result = f contents
return result
Run Code Online (Sandbox Code Playgroud)
我收到错误:
发生检查:无法构造无限类型:a ~ IO a
在 'do' 块的 stmt 中:contents <- readFile l
在表达式中:
do contents <- readFile l
let result = (f contents)
return result
Run Code Online (Sandbox Code Playgroud)
在“readAndProcessFile”的等式中:
readAndProcessFile l f
= do contents <- readFile l
let result = ...
return result
Run Code Online (Sandbox Code Playgroud)
• 相关绑定包括
f :: String -> a
readAndProcessFile :: String -> (String -> a) -> a
Run Code Online (Sandbox Code Playgroud)
的类型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 lRun Code Online (Sandbox Code Playgroud)