Haskell 哈斯克尔:反转';地图';
您可能已经知道,当您使用map时,它接收一个函数,并将该函数应用于列表中的每个元素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 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