我试图编写函数尾部,它将字符串转换成字符串列表,方式如下:
tails "abc" = ["abc", "bc", "c", ""]
以下是我的实现:
tails :: [Char] -> [[Char]]
tails (x:xs)
| length (x:xs) == 0 = [""]
| otherwise = (x:xs) : tails xs
正如标题所暗示的,这个函数中有一些非详尽的模式。不幸的是,我不明白为什么。
我是哈斯克尔的新手。。。任何帮助都将不胜感激!
试试这个怎么样,或者至少从中得到一些逻辑。它工作得很好。它有一个辅助函数来将字符串转换成一个独立字符列表,例如“abc”变成[“a”、“b”、“c”]。这样处理它们就不那么复杂了,而且有必要在结果列表中收集不同的字符串。函数集中有两个函数,第三个函数可以用一个参数调用主函数。主要功能在一行上,但使用警卫。
ca = [[c] | c <- "abcdef"]
f (l1,ls) | null ls = l1++[[]] | True = f ( l1 ++ [concat ls], (tail ls))
f ([],ca)
["abcdef","bcdef","cdef","def","ef","f",""]
编辑4/4/2018我错了。列表参数不必事先制作成列表。如果不这样做,函数会变得更简单,方法是去掉conat函数,并将参数列表从元组更改为单个去掉的批次或括号。
fs l1 ls = if null ls then l1++[""] else fs (l1++[ls]) (tail ls)
它的调用方式也不同。
fs[]"你好!"
这本身就产生了正确的结果。
编辑/添加2018年11月4日
当Haskell使用(x:xs)
将输入拆分为头和尾时,保持重复出现(没有双关语)的是对尾的依赖。下面是一个基本的递归函数,它只对head和tail使用
(x:xs)
。我生成输入列表的所有尾部,包括null。
t [] = [""]; t (x:xs) = [x:xs] ++ t xs
还有一个是以列表作为唯一参数的。
t ls = [drop n ls|n<-[0..length ls - 1]]
该模式不是详尽的,因为它不能接受[]
。列表的形式为[]
或A:as
,其中A
是前导元素,as
是尾随元素的列表。因此,模式x:xs
仅在列表有前导元素时匹配。修正,给出:
tails :: [Char] -> [[Char]]
tails xs
| length xs == 0 = [""]
| otherwise = let (_:xs') = xs in xs : tails xs'
然后,xs
接受列表,而不管其形式如何。但由于长度
,这是低效的,并且不适用于无限列表。
这应该完全有效,它直接进行模式匹配:
tails :: [Char] -> [[Char]]
tails [] = [""]
tails xs@(_:xs') = xs : tails xs'
我的函数使用一个可能是Int的列表作为参数。如果元素=Nothing,则应打印一个。如果元素是一个Just Int,它将打印数字。我以为我抓住了一个基本情况,但我认为我没有抓住正确的一个。。我得到一个非穷举模式错误。 向正确的方向点头表示感谢!:-)
所以我有这个函数,当我尝试这样使用它时:mergesortedList[1,1][1,1]会给我一个错误: [1,1***异常:SortFunctions.hs:(86,1)-(91,89):函数合并分类列表中的非穷举模式 我无法找出问题的根源,因为我想我已经涵盖了所有可能的案例。这里会有什么问题?
我必须使函数:: [((String, String), Int)]- 这就是我提出的功能: 输出应该是一个元组列表,其中的字符串与元组x1中的inputWord以及整数x2成对出现 问题是我得到了我认为不应该存在的非详尽模式。 我试图替换与 这使得非穷举模式在列表不为空时消失,但也阻止了函数遍历元组的最后一个元组。
我使用返回元组的函数。但是当我试图运行这个函数时,它给了我一个例外:函数中的非穷尽模式。
我得到了这个例外,有人知道如何摆脱它吗?' ***例外:hw.hs:(33,1)-(35,53):函数船舶中的非详尽模式' 所有函数都工作正常,除了函数。它可能与元组列表的东西,但我不能弄清楚。下面是代码:
我有一个函数,它想列出所有。 其中t和d是字符串,y是int,f是字符串,r是int(但不确定f和r是否重要,将进一步解释)。 我得到了非穷举模式的错误,并假设这是因为当列表中只有一个元素时,我没有一个,所以我在其他模式之间添加了这个: 它已编译,但当我调用该函数时,它再次告诉我“非穷举模式”。我正在努力思考我错过了什么模式,我应该在之后添加一个通配符模式来捕获所有内容吗?我不想找人把答案打出来,