Haskell 类型上具有算术约束的Typeclass实例

Haskell 类型上具有算术约束的Typeclass实例,haskell,typeclass,type-level-computation,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 (F

基本上,我希望能够做到以下几点:

{-# 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
也就是说,仅当
a=2*b
时,才使
fooab
成为
Clz
的实例

我知道问题出在最后一行的
(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)。

您可以使用类型等效约束(通过启用GADT或类型族):


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

为什么不试试
实例b~(2*a)=>Clz(fooabbc)
?谢谢,我不知道
~
的这个用法。
instance (b ~ (2 * a)) => Clz (Foo a b c) where