haskell Inits和Tails函数

vsnjm48y  于 2023-11-18  发布在  其他
关注(0)|答案(3)|浏览(106)

嘿伙计们我需要为我的assigment声明inits和tails函数
到目前为止我得到了

inits [] = [[]]
inits (x:xs) =  [x]: inits (xs)

字符串
这给了我一个输入inits [1,2]的输出[[1,2],[1],[],[]]好吧,这看起来更像是inits tails函数的失败版本,输出应该是[[1,2],[1],[]]
初始化的输出应该是输入[[],[1],[1,2]]
我不指望有人给我给予解决方案,我只是需要一些提示,我应该如何改变我的代码,我是新到haskell

eh57zj3b

eh57zj3b1#

比较两个具体的例子:

> inits [1,2,3]
[[],[1],[1,2],[1,2,3]]
> inits [2,3]
[[],[2],[2,3]]

字符串
你需要采取什么步骤把第二个结果变成第一个?

w1jd8yoj

w1jd8yoj2#

在我编写inits函数的代码的过程中,tails函数的代码出来了:

tails :: [Int] -> [[Int]]
tails [] = [[]]
tails (x:xs) =  (x:xs): tails xs

字符串

13z8s7eq

13z8s7eq3#

作为显式递归的替代方案,编写tails的一种方法是使用scanr,它的工作方式与foldr非常相似,但将中间结果保存为列表。

Prelude> scanr (:) [] [1,2,3]
[[1,2,3],[2,3],[3],[]]
Prelude> scanr (:) [] $ tail [1,2,3]
[[2,3],[3],[]]
Prelude> tails = scanr (:) [] . tail
Prelude> tails [1,2,3]
[[2,3],[3],[]]

字符串
实现inits可以类似地使用scanl实现:

Prelude> scanl (flip (:)) [] [1,2,3]
[[],[1],[2,1],[3,2,1]]
Prelude> map reverse $ scanl (flip (:)) [] [1,2,3]
[[],[1],[1,2],[1,2,3]]
Prelude> inits = map reverse . scanl (flip (:)) []
Prelude> inits [1,2,3]
[[],[1],[1,2],[1,2,3]]

相关问题