如果我想在问题空间上执行搜索,并且我想跟踪节点已经访问过的不同状态,我several options to do it depending on the constraints of those states。然而;有没有办法根据用户用作输入的状态约束来调度函数或其他函数?例如,如果我有:
data Node a = Node { state :: a, cost :: Double }
我想在Problem a
上进行搜索,有没有办法可以检查a
是Eq
,Ord
还是Hashable
然后拨打另一种搜索?在伪代码中,类似于:
search :: Eq a => Problem a -> Node a
search problem@(... initial ...) -- Where initial is a State of type a
| (Hashable initial) = searchHash problem
| (Ord initial) = searchOrd problem
| otherwise = searchEq problem
我知道我可以让用户根据自己的用途选择一个search
或另一个;但是能够做这样的事情对我来说非常方便,因为搜索实际上不是用户端点之一(一个例子可能是函数bfs
,用一些参数调用search
使它表现得像广度优先搜索。)
答案 0 :(得分:2)
不,你不能这样做。但是,您可以创建自己的类:
class Memorable a where
type Memory a
remember :: a -> Memory a -> Memory a
known :: a -> Memory a -> Bool
为几种基类型实例化此类,并为想要添加新实例的人添加一些默认实现,例如
-- suitable implementations of Memorable methods and type families for hashable things
type HashMemory = Data.HashSet.HashSet
hashRemember = Data.HashSet.insert
hashKnown = Data.HashSet.member
-- suitable implementations for orderable things
type OrdMemory = Data.Set.Set
ordRemember = Data.Set.insert
ordKnown = Data.Set.member
-- suitable implementations for merely equatable things
type EqMemory = Prelude.[]
eqRemember = (Prelude.:)
eqKnown = Prelude.elem