检查函数中的Haskell类型类

时间:2017-06-30 11:32:51

标签: haskell typeclass

如果我想在问题空间上执行搜索,并且我想跟踪节点已经访问过的不同状态,我several options to do it depending on the constraints of those states。然而;有没有办法根据用户用作输入的状态约束来调度函数或其他函数?例如,如果我有:

data Node a = Node { state :: a, cost :: Double }

我想在Problem a上进行搜索,有没有办法可以检查aEqOrd还是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使它表现得像广度优先搜索。)

1 个答案:

答案 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