非详尽模式,哈斯克尔



我正在尝试编写函数尾巴,它通过以下方式将字符串转换为字符串列表:

tails "abc" = ["abc", "bc", "c", ""]

这是我的实现:

tails :: [Char] -> [[Char]]
tails (x:xs)
| length (x:xs) == 0 = [""]
| otherwise = (x:xs) : tails xs

正如标题所暗示的那样,此函数中存在非详尽的模式。不幸的是,我不明白怎么会这样。

我是哈斯克尔的新手...任何帮助将不胜感激!

该模式不是详尽的,因为它不能接受[]。列表有[]a:as的形式,其中a是前导元素,as是尾随元素的列表。因此,仅当列表具有前导元素时,模式x:xs匹配。修复它给出了:

tails :: [Char] -> [[Char]]
tails xs
| length xs == 0 = [""]
| otherwise = let (_:xs') = xs in xs : tails xs'

然后xs接受列表,无论其形式如何。 但是由于length,这是低效的,并且不适用于无限列表。

这应该完全有效,它直接进行模式数学:

tails :: [Char] -> [[Char]]
tails [] = [""]
tails xs@(_:xs') = 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我错了。列表参数不必事先制作成列表。如果不这样做,通过删除 concat 函数并将参数列表从元组更改为单个删除的批次或括号,函数变得更加简单。

fs l1 ls = if null ls then l1++[""] else fs (l1++[ls]) (tail ls)

它的调用方式也不同。

fs [] "你好!">

这本身就产生了正确的结果。

编辑/添加 4/11/2018

不断重复(没有双关语)的是当Haskell将输入拆分为头尾和尾部时(x:xs)他们准备使用时对tail的依赖。这是一个基本的递归函数,仅将(x:xs)用于头部和尾部。我生成输入列表的所有尾部,包括 null。

t [] = [""]; t (x:xs) = [x:xs] ++ t xs

还有一个将列表作为唯一参数

t ls = [drop n ls|n<-[0..length ls - 1]]

相关内容

  • 没有找到相关文章

最新更新