Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.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
Function Haskell语法,将文件内容绑定到变量_Function_Haskell_If Statement_Syntax - Fatal编程技术网

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
的结果需要有type
IO()
,因此您可以像
main
那样简单地将其附加到
do
块,但显然它有type
String->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)))