gpt4 book ai didi

haskell - 如何在do block 中读取文件

转载 作者:行者123 更新时间:2023-12-04 02:33:45 25 4
gpt4 key购买 nike

我正在学习 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” block 的 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
• 相关绑定(bind)包括
f :: String -> a
readAndProcessFile :: String -> (String -> a) -> a

最佳答案

readAndProcessFile 的类型是 String -> (String -> a) -> IO a .确实,您使用 do block ,所以这意味着它是一元的。你这里基本上写的是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

关于haskell - 如何在do block 中读取文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62812694/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com