Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String haskell中的前缀列表_String_Haskell_Prefixes - Fatal编程技术网

String haskell中的前缀列表

String haskell中的前缀列表,string,haskell,prefixes,String,Haskell,Prefixes,我将编写一个函数,返回给定字符串的所有前缀的列表 到目前为止我就在这里 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

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

到目前为止我就在这里

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"

我没有主意了。有什么提示吗?

我认为这段代码并不像您认为的那样。您尝试将列表x与模式[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 "stackoverflow"
["","s","st","sta","stac","stack","stacko","stackov","stackove","stackover","stackoverf","stackoverfl","stackoverflo","stackoverflow"]
但是,对于计算前缀的函数,实际上不需要累加器,我会这样写:

prefixes' (x:xs) = [] : (map (x:) (prefixes' xs))
prefixes' [] = [[]]
此函数在Data.List中的inits名称下也可用

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

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

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

好的,这很有启发性。我想我刚刚了解了:操作符的工作原理。非常感谢!前缀'中的递归函数调用中缺少撇号。