类型别名声明中的Haskell类型类

时间:2017-01-25 13:56:42

标签: haskell types typeclass generic-type-argument

我正在尝试开发一个模块,通过接收将它们作为参数进行管理的功能,在一组状态上执行不同的算法。我正在定义不同类型的别名,以便更容易实现;理解这一点的一个简单例子是:

-- 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只要他能够实施ExpandEval函数,并让我比较两个不同的状态。

如何推广类型State来实现这一目标?我想到的直观事情就像type State = (Eq a) => a一样,但如果没有范围a,这显然是不可能的。我有一种简单的方法来声明将State视为黑盒的函数吗?

1 个答案:

答案 0 :(得分:4)

您需要将通用状态包含为类型参数。

O(n)

完全隐藏它是不可能的,因为例如type Expand s = s -> s type Eval s = s -> Float type Tree s = [s] 状态的Expand(Int, Int)州完全不同。

至于String约束。通常,您只在本地包含需要约束的特定函数。