Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String Haskell类型不匹配_String_Haskell_Types_Match_Loading - Fatal编程技术网

String Haskell类型不匹配

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

我想做一个函数,它接受一个字符串“path”,这是一个只有一行的文件的路径,我想接受这一行并检查它是否是一个正确的表达式,如果它要用这个字符串构建一个树,下面是代码 `


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