我有这个功能:
map(\x -> l ++ [x]) "Show" where l = ""
我希望在 map 函数的每一步都保存 l 的值(例如,我不想返回["S","h","o","w"]
,我希望它返回["S","Sh","Sho","Show"]
)
有人能帮我吗?
你快到了:
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
预定义。
现在,如果您为此查找 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 索引所有基础作为开始。
使用scanl
:
Prelude> scanl (\a c -> a++[c]) "" "Show"
["","S","Sh","Sho","Show"]
一个高效的版本:
Prelude> map reverse . scanl (flip (:)) [] $ "Show"
["","S","Sh","Sho","Show"]
> tail $ inits "Show"
["S","Sh","Sho","Show"]
只需结合 Prelude 中的 inits 和 tail 函数:
tail . inits $ "Show"