首页 > 解决方案 > 如何在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

标签: haskell

解决方案


的类型readAndProcessFileString -> (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

推荐阅读