Function Haskell语法,将文件内容绑定到变量
代码的主要思想是我从一个只有一行的文件中加载一个表达式,比如Function Haskell语法,将文件内容绑定到变量,function,haskell,if-statement,syntax,Function,Haskell,If Statement,Syntax,代码的主要思想是我从一个只有一行的文件中加载一个表达式,比如100+a+(x^2) 我想把它加载到一个函数中,检查它是否正常(所以它不像)+52a**)。首先我想说,我知道我的检查并没有涵盖所有类型的错误,但我们必须只检查一些错误。首先是代码 main = do contents <- readFile "file.txt" let stringToCheck <- line contents checkIfProper filter (/=' ') str
100+a+(x^2)
我想把它加载到一个函数中,检查它是否正常(所以它不像)+52a**
)。首先我想说,我知道我的检查并没有涵盖所有类型的错误,但我们必须只检查一些错误。首先是代码
main = do
contents <- readFile "file.txt"
let stringToCheck <- line contents
checkIfProper filter (/=' ') stringToCheck
main=do
目录
在这里,您不需要这种特殊的赋值语法:正如我所说的,contents
是一个“纯”值,因此您使用它的任何内容都是纯功能性的,您可以使用普通的=
。这总是在let
块中完成的。所以
let stringToCheck = line contents
嗯,这不起作用,因为没有行
函数。有行
,它将文本拆分为字符串列表,每个字符串代表一行;要检索第一个,请使用
let stringToCheck = head $ lines contents
但是如果文件只有一行,那么这相当于简单地stringToCheck=contents
checkIfProper filter (/=' ') stringToCheck
现在,假设您的意思是checkIfProper(filter(/='')stringToCheck)
:函数checkIfProper
只接受一个参数,但如果您只是写出一个复合表达式,它被错放为两个不同的参数,即checkIfProper filter(/='')stringToCheck实际上意味着用非通用语言编写的内容checkifproperty(filter,(/=''),stringToCheck)
。我想你不是那个意思
用Haskell编写它的惯用方法是
checkIfProper $ filter (/=' ') stringToCheck
生成的main
可能仍然无法编译:checkIfProper
的结果需要有typeIO()
,因此您可以像main
那样简单地将其附加到do
块,但显然它有typeString->Bool
。也许你想把结果打印出来,就这样结束了
print . checkIfProper $ filter (/=' ') stringToCheck
如果您不熟悉
和$
:您可以阅读以下表达式
f . g . h $ x + y
作为
您在发布时丢失了一些格式。Haskell是格式敏感的,所以这将您的代码变成了垃圾。请修复。我没有试着阅读你的代码,但一些立即可用的低挂果实是:Bool
s是False
和True
,而不是False
和True
…而且,它不是'elem'
-中缀符号使用反勾号。你的警卫根本就不会分析。你看过Haskell的介绍了吗?我不是有意粗鲁,但您似乎试图在这里一下子咀嚼掉太多东西。而且您似乎很难将命令式编程抛在脑后。你不应该到处使用do块。编写大量小而简单的函数,而不是一个大型的“无所不能”函数。此外,您不在顶层使用let语句,也不使用,但当我尝试在WinCHCi中加载文件时,它会显示“解析错误(可能是不正确的缩进或不匹配的括号)”,我只是在加载和过滤字符串的一部分。嗯,那么,正如编译器所建议的,您可能有不正确的缩进!我根本无法格式化评论中的代码,但我会尝试:import System.IO main=do
内容我发现了问题,我真的很抱歉所有的问题和我为此所做的垃圾邮件。下一次我会更加小心,下一个问题会贴得更好。
print . checkIfProper $ filter (/=' ') stringToCheck
f . g . h $ x + y
f (g (h (x + y)))