我正在尝试开发一个模块,通过接收将它们作为参数进行管理的功能,在一组状态上执行不同的算法。我正在定义不同类型的别名,以便更容易实现;理解这一点的一个简单例子是:
-- Function that expands a state
type Expand = State -> State
-- Function that evaluates a state
type Eval = State -> Float
-- Group of states
type Tree = [State]
然后我意识到我希望State
成为一个等同类型的别名:我真的不在乎用户的状态是(Int, Int)
,Float
还是String
只要他能够实施Expand
和Eval
函数,并让我比较两个不同的状态。
如何推广类型State
来实现这一目标?我想到的直观事情就像type State = (Eq a) => a
一样,但如果没有范围a
,这显然是不可能的。我有一种简单的方法来声明将State
视为黑盒的函数吗?
答案 0 :(得分:4)
您需要将通用状态包含为类型参数。
O(n)
完全隐藏它是不可能的,因为例如type Expand s = s -> s
type Eval s = s -> Float
type Tree s = [s]
状态的Expand
与(Int, Int)
州完全不同。
至于String
约束。通常,您只在本地包含需要约束的特定函数。