具有类型算术约束的类型类实例

时间:2016-09-23 20:00:08

标签: haskell typeclass type-level-computation

基本上,我希望能够做到这样的事情:

{-# LANGUAGE KindSignatures #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE FlexibleInstances #-}
import GHC.TypeLits

newtype Foo (a::Nat) (b::Nat) c = Foo {getFoo :: c}

class Clz a where

instance Clz (Foo a (2*a) c) where

即,仅在Foo a b时才Clz a = 2*b实例。

我理解问题出在最后一行的(2*a)表达式中。当我尝试编译它时,我得到:

• Illegal type synonym family application in instance:
    Foo a (2 * a) c
• In the instance declaration for ‘Clz (Foo a (2 * a) c)’

有没有办法克服这个问题?我如何更改语法?我需要更多语言扩展吗?我使用的是最新的GHC(8.0.1)。

1 个答案:

答案 0 :(得分:3)

您可以使用类型等价约束(通过启用GADT或键入系列):

instance (b ~ (2 * a)) => Clz (Foo a b c) where

这是使用类型系列的常用技术,如other answer所示。这个答案有更多的解释:这个约束并不意味着与您想要的版本完全相同,但可能仍然可以用于您的目的。