我有这个功能:
map(\x -> l ++ [x]) "Show" where l = ""
我想在地图函数的每一步保存l的值(例如,我不想返回["S","h","o","w"]
,我希望它返回["S","Sh","Sho","Show"]
)
有人可以帮助我吗?
答案 0 :(得分: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
。
现在,如果您查找hoogle,http://www.haskell.org/hoogle/?q=inits您可以点击查找
inits :: [a] -> [[a]]
inits xs = [] : case xs of
[] -> []
x : xs' -> map (x :) (inits xs')
几乎完全相同的想法,但在case语句中,它将模式匹配移动到函数的内部。
请注意,这与您想要的略有不同,因为您在答案的前面得到[]
,但您可以使用tail
来摆脱它。
myinits = tail.inits
您想将列表转换为列表列表。那应该是[a]->[[a]]
类型。你可以在hoogle http://www.haskell.org/hoogle/?hoogle=[a]+-%3E+ [[a]]上搜索它,这是最好的答案(更一般地说,它可能会降低你的'我必须浏览一下。
这适用于许多标准函数,因为hoogle会为所有基础编制索引。
答案 1 :(得分:2)
使用scanl
:
Prelude> scanl (\a c -> a++[c]) "" "Show"
["","S","Sh","Sho","Show"]
高效版本:
Prelude> map reverse . scanl (flip (:)) [] $ "Show"
["","S","Sh","Sho","Show"]
答案 2 :(得分:1)
> tail $ inits "Show"
["S","Sh","Sho","Show"]
答案 3 :(得分:1)
只需将Prelude中的inits和tail函数组合起来:
tail . inits $ "Show"