代码的主要思想是我从一个文件中加载一个表达式,该文件只有一行,如100 + a + (x ^ 2)
我想在函数中加载它并检查它是否正常(因此它不像)) + 5 2 a **
)。首先我要说的是,我知道我的支票并未涵盖所有类型的错误,但我们必须检查一些错误。首先是代码
main = do
contents <- readFile "file.txt"
let stringToCheck <- line contents
checkIfProper filter (/=' ') stringToCheck
正如你所看到的,我对Haskell来说真的很陌生,我希望这个可行,我会一步一步地修复它。我认为逻辑上很好,只有语法错误,我无法理解。
我的第一个问题是在主文件的开头我从file.txt加载这个文件只有1行,我把它放在stringToCheck中,然后我想用它来删除所有空格,但这并不是'工作。如果我在一个字符串上调用过滤器,我现在写下它很好,但是当我从文件中加载它有问题时我想我没有正确使用该行,所以如何做到这一点?
如何从文件中正确获取字符串并将其用作其他函数中的变量?
答案 0 :(得分:2)
main = do
contents <- readFile "file.txt"
到目前为止一切都很好。您已在IO
中读取该文件,并正确使用do
- 块语法和<-
。对于下面的所有内容,contents
是一个String
变量,用于保存文件的内容。
let stringToCheck <- line contents
在这里,你不需要这种特殊的赋值语法:就像我说的那样,contents
是一个“纯粹”的值,所以你用它的任何东西都是纯粹的功能性的你可以使用普通的=
。这总是在let
块中完成。所以......
let stringToCheck = line contents
嗯,这不起作用,因为没有line
功能。有lines
,它将字符串列表中的文本分开,每个字符串代表一行;检索第一个使用
let stringToCheck = head $ lines contents
但如果只有的文件一行,那么这相当于stringToCheck = contents
。
checkIfProper filter (/=' ') stringToCheck
现在,假设你的意思是checkIfProper (filter (/=' ') stringToCheck)
:函数checkIfProper
只接受一个参数,但是如果你只是写出一个复合表达式被误解为几个不同的参数,即{ {1}}实际上意味着用非语言语言编写checkIfProper filter (/=' ') stringToCheck
。我不认为你的意思!
在Haskell中编写它的惯用方法是
checkIfProper(filter, (/=' '), stringToCheck)
生成的 checkIfProper $ filter (/=' ') stringToCheck
可能仍然无法编译:{{1}}的结果需要包含main
类型,因此您只需将其附加到checkIfProper
块,如IO ()
1}},但显然它的类型为do
。也许你想要打印出结果,用
main
如果您不熟悉String -> Bool
和 print . checkIfProper $ filter (/=' ') stringToCheck
:您可以阅读类似
.
作为
$