-1

我有这个功能:

map(\x -> l ++ [x]) "Show" where l = ""

我希望在 map 函数的每一步都保存 l 的值(例如,我不想返回["S","h","o","w"],我希望它返回["S","Sh","Sho","Show"]

有人能帮我吗?

4

4 回答 4

9

你快到了:

inits (x:xs) = map (\ys -> x:ys) ([]:inits xs)
inits [] = []

但请注意,您可以重写(\ys -> x:ys)(x:),它放在x它遇到的每个列表的前面,给出

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

之所以有效,是因为map (x:) ([]:inits xs)给了你(x:[]) : map (x:) (inits xs),所以列表中的所有内容都以 . 开头x,而第一个就是[x]. 也是如此inits xs,因此每个元素都更长。

有一个标准功能

像往常一样,你不是第一个想要这个的人,这就是为什么这个函数已经在Data.List. 您需要做的就是添加

import Data.List

到程序的顶部,您将获得inits预定义。

那里的 inits 是如何定义的?

现在,如果您为此查找 hoogle,http: //www.haskell.org/hoogle/?q=inits您可以点击查找

inits                   :: [a] -> [[a]]
inits xs                =  [] : case xs of
                                  []      -> []
                                  x : xs' -> map (x :) (inits xs')

这几乎是完全相同的想法,但是在一个 case 语句中,它将模式匹配移动到函数内部。

请注意,这与您想要的略有不同,因为您[]的答案前面有 a,但您可以使用tail它来摆脱它。

myinits = tail.inits

你怎么能找到是否已经有一个函数?

您想将列表转换为列表列表。那应该有 type [a]->[[a]]。您可以在 hoogle http://www.haskell.org/hoogle/?hoogle=[a]+-%3E+[[a]] 上搜索它,这是最佳答案(更一般地说,它可能会更低,而你' d 必须浏览一下。

这适用于许多标准功能,因为 hoogle 索引所有基础作为开始。

于 2013-04-19T17:29:43.580 回答
2

使用scanl

Prelude> scanl (\a c -> a++[c]) "" "Show"
["","S","Sh","Sho","Show"]

一个高效的版本:

Prelude> map reverse . scanl (flip (:)) [] $ "Show"
["","S","Sh","Sho","Show"]
于 2013-04-19T17:28:42.003 回答
1

使用Data.List.inits

> tail $ inits "Show"
["S","Sh","Sho","Show"]
于 2013-04-19T17:30:33.043 回答
1

只需结合 Prelude 中的 inits 和 tail 函数:

tail . inits $ "Show"
于 2013-04-19T17:31:16.673 回答