Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.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
Haskell 函数len中的非穷举模式_Haskell_Read Eval Print Loop_Ghci_Non Exhaustive Patterns_Multiline Repl Definition - Fatal编程技术网

Haskell 函数len中的非穷举模式

Haskell 函数len中的非穷举模式,haskell,read-eval-print-loop,ghci,non-exhaustive-patterns,multiline-repl-definition,Haskell,Read Eval Print Loop,Ghci,Non Exhaustive Patterns,Multiline Repl Definition,我正在编写这个函数len,它计算GHCi中列表的长度 len [] = 0 len [x] = 1 len (x:xs) = 1 + len xs 我试图用[]作为参数调用函数,但错误异常:函数len中的非穷举模式击中了我。我不是已经在函数定义中包含了空列表吗?正如chi在评论中所说,GHCi不是这样工作的 可以使用分号在GHCi中输入多零件定义,如下所示: len[]=0;len x:xs=1+len xs 单项目列表的情况由第二部分处理,因为[x]==x:[]正如chi在评论中所说,GHC

我正在编写这个函数len,它计算GHCi中列表的长度

len [] = 0
len [x] = 1
len (x:xs) = 1 + len xs

我试图用[]作为参数调用函数,但错误异常:函数len中的非穷举模式击中了我。我不是已经在函数定义中包含了空列表吗?

正如chi在评论中所说,GHCi不是这样工作的

可以使用分号在GHCi中输入多零件定义,如下所示:

len[]=0;len x:xs=1+len xs


单项目列表的情况由第二部分处理,因为[x]==x:[]

正如chi在评论中所说,GHCi不是这样工作的

可以使用分号在GHCi中输入多零件定义,如下所示:

len[]=0;len x:xs=1+len xs


单项目列表的情况由第二部分处理,因为[x]==x:[]

根据Paul的答案展开,您还可以使用:{,:}在ghci中编写多行定义

例如


扩展Paul的答案,您还可以使用:{,:}在ghci中编写多行定义

例如


GHCi中的多行定义如下所示。如果您在.hs文件中编写代码,然后在GHCi中加载代码,则会更容易。在您的例子中,最后一行被解释为一个覆盖前一行的定义,实际上忽略了前两行,因此出现了错误。另外,您不需要将单例列表作为中间行,因为它由一般的非空列表案例底线覆盖相同的结果。具体来说,[x]是x的语法糖:[]这能回答你的问题吗?GHCi中的多行定义如下所示。如果您在.hs文件中编写代码,然后在GHCi中加载代码,则会更容易。在您的例子中,最后一行被解释为一个覆盖前一行的定义,实际上忽略了前两行,因此出现了错误。另外,您不需要将单例列表作为中间行,因为它由一般的非空列表案例底线覆盖相同的结果。具体来说,[x]是x的语法糖:[]这能回答你的问题吗?这确实是可能的+1,但我建议永远不要这样做。多行并不能真正为你买任何东西,无论是编辑还是阅读,这都不是REPL的目的。任何不容易放在一行中的内容通常最好放在文件中。事实上,我有时用GHCi编写很长的命令,但仍然喜欢将它们保留在一行中,即使终端需要断开该行,因为这允许使用向上箭头重复/编辑整个过程,而多行定义要求您独立检索每一行–非常笨拙。这确实是可能的+1,但我建议永远不要这样做。多行并不能真正为你买任何东西,无论是编辑还是阅读,这都不是REPL的目的。任何不容易放在一行中的内容通常最好放在文件中。事实上,我有时会用GHCi编写很长的命令,但仍然喜欢将它们保留在一行中,即使终端需要断开该行,因为这允许使用向上箭头重复/编辑整个过程,而多行定义要求您独立检索每一行–非常尴尬。
:{
len [] = 0
len (x:xs) = 1 + len xs
:}