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