【发布时间】:2013-07-08 20:38:41
【问题描述】:
我希望一些 Haskell 专家可以帮助澄清一些事情。
是否可以以通常的方式定义Nat(通过@dorchard Singleton types in Haskell)
data S n = Succ n
data Z = Zero
class Nat n
instance Nat Z
instance Nat n => Nat (S n)
(或其一些变体),然后定义LessThan 关系
这样对于所有n 和m
LessThan Z (S Z)
LessThan n m => LessThan n (S m)
LessThan n m => LessThan (S n) (S m)
然后编写一个类型如下的函数:
foo :: exists n. (LessThan n m) => Nat m -> Nat n
foo (S n) = n
foo Z = foo Z
我明确想在foo 的输出类型中使用“LessThan”,
我意识到一个人当然可以写出类似
foo :: Nat (S n) -> Nat n
但这不是我想要的。
谢谢!
兰吉特。
【问题讨论】:
-
foo :: exists n...– 真的吗?所以你想让foo返回它喜欢的任何类型,唯一的限制是它是“小于m”?这在 Haskell 中是不可能的(不仅仅是那样),这是正确的。还是您的意思是,foo可以返回调用者请求的任何类型,只要它小于m? -
“some”似乎可以与该句子中的“any”互换。关键问题是:谁来决定它的类型?
-
没有人决定,我只想要一个说明“输出是 some nat 严格小于输入”(没有说 what 这个数字是……)
-
那么决定类型 是 取决于函数(或者如果你愿意的话,那家伙如何实现它)?
-
@MonadNewb 这是类型级编程,用于一些超狡猾的类型技巧。 Ranjit 在类型系统中编码整数而不是数据,这就是为什么
LessThan也需要在类型系统中。在您对 Haskell 非常有信心之前,忽略类型级编程是安全的。
标签: haskell gadt dependent-type singleton-type