Haskell语法,将文件内容绑定到变量

时间:2014-02-04 16:42:11

标签: function haskell if-statement syntax

代码的主要思想是我从一个文件中加载一个表达式,该文件只有一行,如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中,然后我想用它来删除所有空格,但这并不是'工作。如果我在一个字符串上调用过滤器,我现在写下它很好,但是当我从文件中加载它有问题时我想我没有正确使用该行,所以如何做到这一点?

如何从文件中正确获取字符串并将其用作其他函数中的变量?

1 个答案:

答案 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 :您可以阅读类似

的表达式
.

作为

$