Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.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
Haskell 哈斯克尔:反转';地图';_Haskell - Fatal编程技术网

Haskell 哈斯克尔:反转';地图';

Haskell 哈斯克尔:反转';地图';,haskell,Haskell,您可能已经知道,当您使用map时,它接收一个函数,并将该函数应用于列表中的每个元素 map f xs is the list obtained by applying f to each element of xs, i.e., 但在我的例子中,我有一个需要应用的函数列表,以获得一个特定的值。以下是一些类型,以便更好地了解: data Auto = Auto {plate :: String, currentTank :: Int, tanqSize :: Int} deriving (Sho

您可能已经知道,当您使用map时,它接收一个函数,并将该函数应用于列表中的每个元素

map f xs is the list obtained by applying f to each element of xs, i.e.,
但在我的例子中,我有一个需要应用的函数列表,以获得一个特定的值。以下是一些类型,以便更好地了解:

data Auto = Auto {plate :: String, currentTank :: Int, tanqSize :: Int} deriving (Show, Eq)
type Services = Car -> Car
service :: Car -> [Services] -> Car
正如我在前面解释的那样,[服务]将是一个函数列表,其中recibe“Car”和return“Car”。我需要将这些功能应用于接受“服务”的“汽车”,并在完成所有修改后返回

以下是列表中可能出现的一些函数示例:

emptyTank :: Services
reFuel :: Int -> Services
changePlate :: String -> Services
upgradeTank :: Int -> Services

有人知道解决这个问题的方法吗?如果您知道要使用的函数比map更精确,请告诉我,我会研究它。

您可以使用
foldl

service :: Car -> [Services] -> Car
service car functions = foldl (flip ($)) car functions

service someCar [emptyTank, (refuel 10), (changePlate "abc 123"), (upgradeTank 15)]
($)
是函数应用程序,但要将其与
foldl
一起使用(要以正确的顺序应用函数,我们需要翻转其参数,以便
arg$f
计算为
f arg
。使用
(翻转($))
使用
foldl
将使
函数
中的第一个函数应用于
汽车
,然后将第二个函数应用于第一个函数的结果,然后将第三个函数应用于第二个函数的结果,以此类推

foldr
可以简单地与
($)
一起使用,而不是与
flip($)
一起使用,但是它将从右向左而不是从左向右应用函数。比较

foldl (flip ($)) 3 [(+4), (*5)]  -- Returns (3+4)*5 = 35

)


另一种方法是将函数列表组合成一个函数:

(upgradeTank 15) . (changePlate "abc 123") . (refuel 10) . emptyTank $ someCar
您也可以使用
foldl
(或
foldr
?在这里使用它似乎没有什么区别),使用
()
将列表缩减为单个函数,然后将该函数应用于
汽车
id
函数用作第一次调用
()
foldl
制作。不过,您确实需要首先反转函数列表,因为组合是右关联的

service car functions = foldl (.) id (reverse functions) $ car

您可以为此使用
foldl

service :: Car -> [Services] -> Car
service car functions = foldl (flip ($)) car functions

service someCar [emptyTank, (refuel 10), (changePlate "abc 123"), (upgradeTank 15)]
($)
是函数应用程序,但要将其与
foldl
一起使用(要以正确的顺序应用函数,我们需要翻转其参数,以便
arg$f
计算为
f arg
。使用
(翻转($))
使用
foldl
将使
函数
中的第一个函数应用于
汽车
,然后将第二个函数应用于第一个函数的结果,然后将第三个函数应用于第二个函数的结果,以此类推

foldr
可以简单地与
($)
一起使用,而不是与
flip($)
一起使用,但是它将从右向左而不是从左向右应用函数。比较

foldl (flip ($)) 3 [(+4), (*5)]  -- Returns (3+4)*5 = 35

)


另一种方法是将函数列表组合成一个函数:

(upgradeTank 15) . (changePlate "abc 123") . (refuel 10) . emptyTank $ someCar
您也可以使用
foldl
(或
foldr
?在这里使用它似乎没有什么区别),使用
()
将列表缩减为单个函数,然后将该函数应用于
汽车
id
函数用作第一次调用
()
foldl
制作。不过,您确实需要首先反转函数列表,因为组合是右关联的

service car functions = foldl (.) id (reverse functions) $ car

查找
$
翻转
,和套用货币。可能的重复项不是建议的重复项;
服务
需要返回单个
汽车
,而不是类型列表
[Car]
.Lookup
$
flip
和currying。可能重复的内容不是建议的重复;
服务
需要返回一辆
汽车
,而不是类型列表
[Car]
。谢谢,这是我如何使用你告诉我的:服务(Car plate currentTanq tanqSize)list=foldl(flip($)(Car plate currentTanq tanqSize)list谢谢,下面是我如何使用你告诉我的:服务(Car plate currentTanq tanqSize)list=foldl(flip($)(Car plate currentTanq tanqSize)list