Haskell 在类型别名声明中输入 类

Haskell Type Classes in Type Alias declaration

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

-- 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 视为黑盒的函数?

您需要将泛型状态作为类型参数包含在内。

type Expand s = s -> s
type Eval s   = s -> Float
type Tree s   = [s]

完全隐藏它是不可能的,因为例如Expand (Int, Int) 状态与 String 状态完全不同。

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