Haskell中的全局变量

-1 variables binding haskell

我有这个功能:

map(\x -> l ++ [x]) "Show" where l = ""
Run Code Online (Sandbox Code Playgroud)

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

有人能帮我吗?

And*_*ewC 9

你快到了:

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为所有基础开始索引.