我有这个功能:
map(\x -> l ++ [x]) "Show" where l = ""
Run Code Online (Sandbox Code Playgroud)
我想在地图函数的每一步保存l的值(例如我不想返回["S","h","o","w"]
,我希望它返回["S","Sh","Sho","Show"]
)
有人能帮我吗?
你快到了:
inits (x:xs) = map (\ys -> x:ys) ([]:inits xs)
inits [] = []
Run Code Online (Sandbox Code Playgroud)
但请注意,您可以重写(\ys -> x:ys)
为(x:)
,它会放在x
它遇到的每个列表的前面,给出
inits (x:xs) = map (x:) ([]:inits xs)
inits [] = []
Run Code Online (Sandbox Code Playgroud)
这是有效的,因为map (x:) ([]:inits xs)
给你(x:[]) : map (x:) (inits xs)
,所以列表中的所有内容都以x
,第一个就是[x]
.这也是如此inits xs
,因此每个元素都会变长一个元素.
像往常一样,你并不是第一个想要这个的人,这就是为什么已经定义了这个功能的原因Data.List
.您需要做的就是添加
import Data.List
Run Code Online (Sandbox Code Playgroud)
到程序的顶部,你得到了inits
预定义.
现在,如果你查找hoogle,http: //www.haskell.org/hoogle/?q =你可以点击查看
inits :: [a] -> [[a]]
inits xs = [] : case xs of
[] -> []
x : xs' -> map (x :) (inits xs')
Run Code Online (Sandbox Code Playgroud)
这几乎是完全相同的想法,但在case语句中,它将模式匹配移动到函数内部.
请注意,这与您想要的略有不同,因为您[]
在答案的前面得到了一个,但您可以使用它tail
来摆脱它.
myinits = tail.inits
Run Code Online (Sandbox Code Playgroud)
您想将列表转换为列表列表.应该有类型[a]->[[a]]
.你可以在hoogle http://www.haskell.org/hoogle/?hoogle=[a]+-%3E+ [[a]]上搜索它,这是最好的答案(更一般地说,它可能会降低你的'我必须浏览一下.
这适用于许多标准功能,因为hoogle为所有基础开始索引.