【发布时间】:2015-01-03 15:14:09
【问题描述】:
要创建一个接受类型级自然值 Z、(S Z)、(S (S Z))... 等的类型类,您可以简单地递归地声明实例:
data Z
data S a
class Type a
instance Type Z
instance Type (S a)
是否可以基于类型级别谓词创建类型类实例?例如,我想能够说:
{-# LANGUAGE MultiParamTypeClasses #-}
class Type a b
instance Type x y when (x :+: y == 8)
其中:+: 是类型级加法,== 是来自Data.Type.Equality 的类型级相等,因此仅为加起来为 8 的 nat 对创建实例。
Haskell 中是否有类似的表示法?如果没有,这样的事情如何完成?
编辑:这篇文章的灵感来自by the Haskell wiki article on smart constructors,其中声明了一个类型类InBounds,以静态验证传递给智能构造函数的幻像类型参数是否在Nats 的某个范围内,智能构造函数是:
resistor :: InBounds size => size -> Resistor size
resistor _ = Resistor
在我的示例中尝试做类似的事情(在使用 leftaroundabout 的答案之后)会给我一个错误:
construct :: (Type a b) => a -> b -> MyType a b
construct _ _ = MyType
>>> Expected a type, but a has kind Nat…
Haskell wiki 中的示例有效,因为它不使用 DataKinds,是否可以将类型 Nat 传递给值级函数?
【问题讨论】: