haskell 中的前缀列表

Posted

技术标签:

【中文标题】haskell 中的前缀列表【英文标题】:List of prefixes in haskell 【发布时间】:2017-01-22 13:29:55 【问题描述】:

我要编写一个函数,它返回给定字符串的所有前缀列表。

这是我目前所处的位置。

prefixess [x] [] = [x]
prefixess [] s = prefixess [s] s
prefixess [x] s  = prefixess [x, (init s)] (init s)
prefixes s = prefixess [] s

它可以编译,但是当我尝试在字符串上运行它时,我得到了这个:

Couldn't match type ‘Char’ with ‘[t]’
Expected type: [[t]]
  Actual type: [Char]
Relevant bindings include
  it :: [t] -> [[t]] (bound at <interactive>:18:1)
In the first argument of ‘prefixess’, namely ‘"abcde"’
In the expression: prefixess "abcde"
In an equation for ‘it’: it = prefixess "abcde"

我没有想法。有什么提示吗?

【问题讨论】:

【参考方案1】:

我认为这段代码不会像你想象的那样做。您尝试将列表 x 与模式 [x] 进行模式匹配,该模式捕获单例列表的元素。如果我像这样修复你的代码,它会起作用:

prefixess x [] = x
prefixess [] s = prefixess [s] s
prefixess x s  = prefixess ((init s):x) (init s)
prefixes s = prefixess [] s

这给出了以下结果:

Main> prefixes "***"
["","s","st","sta","stac","stack","stacko","stackov","stackove","stackover","stackoverf","stackoverfl","stackoverflo","***"]

但是对于计算前缀的函数,你并不真的需要累加器,我会这样写:

prefixes' (x:xs) = [] : (map (x:) (prefixes' xs))
prefixes' [] = [[]]

这个函数也可以在Data.List中以“inits”的名字使用

Main> import Data.List
Main Data.List> inits "***"
["","s","st","sta","stac","stack","stacko","stackov","stackove","stackover","stackoverf","stackoverfl","stackoverflo","***"]

【讨论】:

好的,这很有启发性。我想我刚刚了解了“:”运算符的工作原理。非常感谢! 前缀中的递归函数调用中缺少撇号。【参考方案2】:

生成所有前缀列表的无点样式解决方案:

prefixes = foldr (\el acc -> [] : map (el:) acc) [[]] 

【讨论】:

以上是关于haskell 中的前缀列表的主要内容,如果未能解决你的问题,请参考以下文章

如何获取列表中字符串的公共前缀[重复]

Python - 通过列表中的前缀和后缀删除元组

首选命名空间前缀列表?

如何使用Java中的给定字符串值从数组列表中查找最长前缀?

测试列表以查看它们是另一个列表的前缀还是后缀

如何在列表jquery中的第二个“ li”之后加上前缀