Variables Haskell中的全局变量
我有这个功能:Variables Haskell中的全局变量,variables,haskell,binding,Variables,Haskell,Binding,我有这个功能: map(\x -> l ++ [x]) "Show" where l = "" 我希望在映射函数的每个步骤中保存l的值(例如,我不希望返回[“S”、“h”、“o”、“w”],我希望它返回[“S”、“Sh”、“Sho”、“Show”]) 有人能帮我吗?使用scanl: Prelude> scanl (\a c -> a++[c]) "" "Show" ["","S","Sh","Sho","Show"] 高效版本: Prelude> map revers
map(\x -> l ++ [x]) "Show" where l = ""
我希望在映射函数的每个步骤中保存l的值(例如,我不希望返回[“S”、“h”、“o”、“w”]
,我希望它返回[“S”、“Sh”、“Sho”、“Show”]
)
有人能帮我吗?使用
scanl
:
Prelude> scanl (\a c -> a++[c]) "" "Show"
["","S","Sh","Sho","Show"]
高效版本:
Prelude> map reverse . scanl (flip (:)) [] $ "Show"
["","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
inits是如何定义的?
现在,如果您查找hoogle,您可以通过单击查找
inits :: [a] -> [[a]]
inits xs = [] : case xs of
[] -> []
x : xs' -> map (x :) (inits xs')
这几乎是完全相同的想法,但在case语句中,它将模式匹配移动到函数的内部
请注意,这与您想要的略有不同,因为答案前面有一个[]
,但您可以使用尾部
来消除它
myinits = tail.inits
你怎样才能发现是否已经有一个函数?
您想将列表转换为列表列表。类型应为[a]->[[a]]
。你可以在hoogle上搜索http://www.haskell.org/hoogle/?hoogle=[a] +-%3E+[[a]]这是最上面的答案(一般来说,答案可能会更低,你需要浏览一下
这适用于许多标准函数,因为hoogle一开始就对所有base进行索引。使用:
只需结合Prelude中的inits和tail函数:
tail . inits $ "Show"
您需要的是一个运行的求和/累加器,即使用
scanl
。对于有关全局变量的文字问题,因为这不是它的工作方式。如果a有一个与上述相同的函数,但我希望它对数据类型起作用,那么我该如何做呢?映射(\x->if(isleter x)then(update exp(literal x)”)。else Epsilon)“a+b+c+”其中exp=Epsilon,我希望变量exp更新每个time@Edy这确实是另一个问题-请您单独提问,用Epsilon
和Literal
列出您的数据类型代码,所有这些都供我们参考。
tail . inits $ "Show"