Haskell中的全局变量

时间:2013-04-19 17:24:37

标签: variables haskell binding

我有这个功能:

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

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

有人可以帮助我吗?

4 个答案:

答案 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)

使用Data.List.inits

> tail $ inits "Show"
["S","Sh","Sho","Show"]

答案 3 :(得分:1)

只需将Prelude中的inits和tail函数组合起来:

tail . inits $ "Show"