String Haskell类型不匹配
我想做一个函数,它接受一个字符串“path”,这是一个只有一行的文件的路径,我想接受这一行并检查它是否是一个正确的表达式,如果它要用这个字符串构建一个树,下面是代码 `String Haskell类型不匹配,string,haskell,types,match,loading,String,Haskell,Types,Match,Loading,我想做一个函数,它接受一个字符串“path”,这是一个只有一行的文件的路径,我想接受这一行并检查它是否是一个正确的表达式,如果它要用这个字符串构建一个树,下面是代码 ` readFile具有类型FilePath->IO String,因此您的do块位于IOmonad中。因此,整个函数将返回一个IO(Tree Char),而不是Tree Char,因此需要更改类型签名 编辑:通过创建从输入字符串加载树的函数,可以将函数的有效部分和纯部分分开。然后,您可以将字符串从readFile传递到此函数: r
readFile
具有类型FilePath->IO String
,因此您的do
块位于IO
monad中。因此,整个函数将返回一个IO(Tree Char)
,而不是Tree Char
,因此需要更改类型签名
编辑:通过创建从输入字符串加载树的函数,可以将函数的有效部分和纯部分分开。然后,您可以将字符串从readFile
传递到此函数:
readTree :: String -> Tree Char
readTree contents =
if checkIfProper $ filter (/=' ') contents
then buildTreeFromString contents
else EmptyTree
loadExpression
然后变为:
loadExpression :: FilePath -> IO (Tree Char)
loadExpression path = do
contents <- readFile path
return (readTree contents)
readFile
具有类型FilePath->IO String
,因此您的do
块位于IO
monad中。因此,整个函数将返回一个IO(Tree Char)
,而不是Tree Char
,因此需要更改类型签名
编辑:通过创建从输入字符串加载树的函数,可以将函数的有效部分和纯部分分开。然后,您可以将字符串从readFile
传递到此函数:
readTree :: String -> Tree Char
readTree contents =
if checkIfProper $ filter (/=' ') contents
then buildTreeFromString contents
else EmptyTree
loadExpression
然后变为:
loadExpression :: FilePath -> IO (Tree Char)
loadExpression path = do
contents <- readFile path
return (readTree contents)
我可以创建第二个函数,只从文件中加载字符串并返回一个普通函数,然后在我创建的函数中使用这个普通函数吗?我问这个问题是因为我不太明白要改变什么,你能给我举个例子吗?我真的很抱歉,我对Haskell很陌生。“所以你的
do
块在IO
monad中”似乎有误导性:问题是他不在IO monad中(因为他声称返回一个Tree
),但他需要(为了从文件中读取)。根据需要,更改返回类型会使他进入IO monad。@amalloy-我不认为这有多混乱-OP在IO中,因为readFile
返回一个IO字符串。它们的显式类型签名表示它们不是,但它们是,并且需要修复它们的声明以匹配。我是否可以创建第二个函数,该函数仅从文件加载字符串并返回一个普通的字符串,然后在我创建的函数中使用此普通的字符串?我问这个问题是因为我不太明白要改变什么,你能给我举个例子吗?我真的很抱歉,我对Haskell很陌生。“所以你的do
块在IO
monad中”似乎有误导性:问题是他不在IO monad中(因为他声称返回一个Tree
),但他需要(为了从文件中读取)。根据需要,更改返回类型会使他进入IO monad。@amalloy-我不认为这有多混乱-OP在IO中,因为readFile
返回一个IO字符串。它们的显式类型签名表示它们不是,但它们是,并且需要修复它们的声明以匹配。
loadExpression = fmap readTree readFile