第一个Haskell IO程序是';行不通

第一个Haskell IO程序是';行不通,haskell,Haskell,抱歉,这可能真的很愚蠢,但是有人能解释一下为什么这个程序不能编译吗?我获取的无法将预期类型“a1->String”与实际类型“IO String”匹配 import System.Environment main = do [first, last] <- getArgs firstnames <- lines . readFile "firstnames_male" lastnames <- lines . readFile "lastnames" prin

抱歉,这可能真的很愚蠢,但是有人能解释一下为什么这个程序不能编译吗?我获取的
无法将预期类型“a1->String”与实际类型“IO String”匹配

import System.Environment

main = do
  [first, last] <- getArgs
  firstnames <- lines . readFile "firstnames_male"
  lastnames <- lines . readFile "lastnames"
  print firstnames
导入系统环境
main=do

[第一,最后]您不能执行
行。读取文件“lastnames”

readFile
函数返回一个
IO字符串,而不是
字符串

但是,您可以使用
fmap
功能(或
运算符)来实现以下目的:

main = do
  [first, last] <- argArgs
  firstnames <- lines `fmap` readFile "firstnames_males"
  ...
main=do

[第一,最后]您不能执行
行。读取文件“lastnames”

readFile
函数返回一个
IO字符串,而不是
字符串

但是,您可以使用
fmap
功能(或
运算符)来实现以下目的:

main = do
  [first, last] <- argArgs
  firstnames <- lines `fmap` readFile "firstnames_males"
  ...
main=do

[第一,最后]当我深入阅读这本书时,我会明白这一切意味着什么,我想,现在我会相信你的话!它的意思是,您可以将“readFile”视为一个IO操作,它“环绕”一个字符串。像这样的包装器被称为“函子”。“fmap”功能可以让你接触到函子包装内部,对内容进行锁孔手术,而不需要实际取下包装。我想,当我深入阅读这本书时,我会了解这一切意味着什么,现在我相信你的话!它的意思是,您可以将“readFile”视为一个IO操作,它“环绕”一个字符串。像这样的包装器被称为“函子”。“fmap”函数允许您进入函子包装器内部,对内容进行锁孔手术,而无需实际取下包装器。这不是一个愚蠢的问题,但这种编译器错误(来自类型检查器)是编程haskell时遇到的最常见的错误类型,因此在继续之前,花点时间了解这意味着什么(以及如何读取类型签名,如果必要的话)。您可以搜索“无法匹配预期类型”以获得许多答案,这些答案将指导您如何查找和修复类型错误。@jberryman我正在非常严格地阅读一本书,最终我将了解所有这些IO内容,但现在我只想让我的程序正常工作。太好了,但是你的类型中有
IO
,这一事实与你的错误没有多大关系,也与你如何隔离它没有多大关系。这不是一个愚蠢的问题,而是这种编译器错误(来自类型检查器)是编程haskell时遇到的最常见的错误类型,因此在继续之前,花点时间了解这意味着什么(以及如何读取类型签名,如果必要的话)。您可以搜索“无法匹配预期类型”以获得许多答案,这些答案将指导您如何查找和修复类型错误。@jberryman我正在非常严格地阅读一本书,最终我将了解所有这些IO内容,但现在我只想让我的程序正常工作。太好了,但是,在你的类型中有
IO
,这一事实与你的错误没有多大关系,也与你如何隔离它无关。