编写前缀函数Haskell

编写前缀函数Haskell,haskell,Haskell,我是哈斯克尔的新手[顺便说一句,我爱哈斯克尔:)]。 问题是我想写一个函数myPrefix,它接受一个列表作为输入,并将包含输入列表所有前缀的列表作为输出。例如: *Main> prefix [1,2,3] [[],[1],[1,2],[1,2,3]] 但我想不出一个办法。 如果有人能把我推向正确的方向,我就要负债累累了 我试图找到相关的帖子,但我找不到,所以我贴了一个问题 提前谢谢你 库函数inits执行您想要的操作 另外,考虑这个: prefix :: [a] -> [[a]]

我是哈斯克尔的新手[顺便说一句,我爱哈斯克尔:)]。 问题是我想写一个函数myPrefix,它接受一个列表作为输入,并将包含输入列表所有前缀的列表作为输出。例如:

*Main> prefix [1,2,3]
[[],[1],[1,2],[1,2,3]]
但我想不出一个办法。 如果有人能把我推向正确的方向,我就要负债累累了

我试图找到相关的帖子,但我找不到,所以我贴了一个问题


提前谢谢你

库函数
inits
执行您想要的操作

另外,考虑这个:

prefix :: [a] -> [[a]]
prefix [] = baseCase
prefix (x:xs) = doSomethingTo (prefix xs)
你能猜出
baseCase
doSomethingTo
应该是什么吗

对于后者:思考如何转变

prefix [2,3] = [[], [2], [2,3]]
进入

一种方法是首先将
[[],[2],[2,3]]
转换为
[[1],[1,2],[1,2,3]]
,然后在前面添加额外的
[]

无点解决方案:

suffixes, prefices :: [a] -> [[a]]

suffixes []          = [] : []
suffixes lst@(_ : s) = lst : suffixes s

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

小提示:如果你知道你想要的函数的签名,那么你可以在或上搜索它。在这两种情况下,
[a]->[[a]]
的第一个结果实际上就是您要寻找的答案。当然,这并不总是那么容易,但这是一个很好的开始。@PeterHall,谢谢你,Peter,非常有用的提示!!!结果证明这是非常缓慢的。
prefixes = foldr (\el acc -> [] : map (el:) acc) [[]]