haskell - 在haskell中获取列表的长度
问题描述
所以我做了 4 个函数,它们“全部”在一个空数组上返回一个错误
--
myLength1 :: (Num b) => [a] -> b
mylength1 [] = 0
myLength1 (_:as) = 1 + myLength1 as
--
myLength2 :: [a] -> Integer
mylength2 [] = 0
myLength2 (_:as) = 1 + myLength2 as
myLength3 :: (Num b) => [a] -> b
mylength3 [] = 0
myLength3 (a:[]) = 1
myLength3 (a:as) = 1 + myLength3 as
myLength4 :: [a] -> Integer
mylength4 [] = 0
myLength4 (a:[]) = 1
myLength4 (a:as) = 1 + myLength4 as
ghci 输出
HCi, version 8.6.5: http://www.haskell.org/ghc/ :? for help
Prelude>
Prelude> :load myLength.hs
[1 of 1] Compiling Main ( myLength.hs, interpreted )
Ok, one module loaded.
*Main> myLength1 ""
*** Exception: myLength.hs:4:1-36: Non-exhaustive patterns in function myLength1
*Main> myLength2 ""
*** Exception: myLength.hs:9:1-36: Non-exhaustive patterns in function myLength2
*Main> myLength3 ""
*** Exception: myLength.hs:(13,1)-(14,36): Non-exhaustive patterns in function myLength3
*Main> myLength4 ""
*** Exception: myLength.hs:(18,1)-(19,36): Non-exhaustive patterns in function myLength4
*Main>
异常消息并没有真正的帮助,myLength1
实际上是从 http://learnyouahaskell.com/syntax-in-functions#pattern-matching复制的。
我希望有人能向我解释什么是错的。
谢谢大家不吝赐教!!
显然我有一个错字,但haskell编译器不应该抱怨这个吗?
我试过了
myLength1 :: (Num b) => [a] -> b
myLength2 :: [a] -> Integer
myLength3 :: (Num b) => [a] -> b
myLength4 :: [a] -> Integer
myLength4 [] = 0
myLength4 (a:[]) = 1
myLength4 (a:as) = 1 + myLength4 as
myLength3 [] = 0
myLength3 (a:[]) = 1
myLength2 [] = 0
myLength2 (_:as) = 1 + myLength2 as
myLength1 [] = 0
myLength1 (_:as) = 1 + myLength1 as
一切都很好..而且令人费解..我现在才意识到,但是 haskell 是一种可以写任何地方的语言.. 就像我不必保持我的 $#!t 干净,只要它不发臭。
解决方案
这是一个相当简单但很难发现的问题。让我们以 myLength1 为例:
myLength1 :: (Num b) => [a] -> b
mylength1 [] = 0
myLength1 (_:as) = 1 + myLength1 as
您将第 1 行的函数定义为 myLength1。但是,在第 2 行,您使用名为 mylength1 的函数进行模式匹配。您收到错误“函数中的非详尽模式”的原因是因为第 2 行没有被识别为您的基本情况,因为它们没有使用相同的函数名称。
您的其他功能似乎就是这种情况。
希望这是有道理的!
推荐阅读
- java - Eclipse 打不开
- google-apps-script - 选择下拉列表后复制到新的 google-doc-sheet 吗?
- java - 如何在 Spring Boot 中的每个请求中添加具有静态值所需的特定 Header?
- java - Hibernate:引用关联中的列,以提高效率
- javascript - 由于需要 Javascript,Paypal 智能按钮在电子邮件中不起作用。有什么建议么?
- git - 是否可以在 GitHub 中删除远程存储库的提交历史记录(最新的除外),同时保持所有本地存储库的提交完整?
- c# - 您如何从串口数据中发送 c# 并在不崩溃的情况下断开连接并重新连接?
- c++ - 为什么在与GLSL中的矩阵相乘后z坐标会翻转 - OpenGL
- find - 如果搜索命中产品,EPi 查找会获取所有变体
- powershell - 在 .bat 文件中切换用户