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 中的前缀列表的主要内容,如果未能解决你的问题,请参考以下文章