我想在Haskell中编程成本函数,但似乎我高估了模式匹配的功能。这是我已经定义的代码:编程成本函数的最佳方式(相关函数 - 值)
-- Directions for the movement
data Direction = North | East | West | South deriving (Show, Eq)
-- An `Action` gets a Coord and returns another Coord if possible
type Action = Coord -> Maybe Coord
-- Move function; `move North` is an Action
move :: Direction -> Action
move d (x, y) = ...
我的主要问题是,现在我必须定义一个Cost
功能使得:
type Cost = Coord -> Action -> Double
在情况下,我想有一个简单的成本函数只检查方向返回一个成本,即来到了我的脑海里第一个想法是利用模式匹配的,但这是无效的语法(和说实话,它似乎很公平):
mazeCost :: Cost
mazeCost (x, y) (move East) = 3
mazeCost (x, y) (move West) = 5
-- ... And on and on
我目前的解决方案涉及到计算目标状态,并将其与每个操作的结果进行比较,以检查这是否是作为参数传递的函数,但这看起来很乱,并不是超级简短的,我认为也许有很多更好的方式来做到这一点在Haskell:
mazeCost :: Cost
mazeCost coord action
| destination == east = 1
| destination == west = 2
| destination == north = 3
| destination == south = 0
where destination = action coord
east = move East coord
west = move West coord
south = move South coord
north = move North coord
有没有更好的方式与成本值(Double
)的函数(Coord -> Direction -> Maybe Coord
)相关联?这是我试图编写的一个简单示例,如果示例代码中存在任何不一致或者不清楚,请询问。
如果'destination'不是四个主要方向之一?例如。如果它是“移动”的组合? – luqui
为什么用移动的结果而不是选定的方向来表示动作,这将允许您进行模式匹配? –
@ Li-yaoXia这正是我想要做的,但是我现在传递给函数的是已经部分应用的函数,比如'move East'。这是我试图模式匹配,但我不知道“解压”这些值的语法 –