Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Variables Haskell中的全局变量_Variables_Haskell_Binding - Fatal编程技术网

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"