2017-05-29 49 views
1

我真的不知道下面的代码有什么问题。Haskell中的刚性类型变量

data TypeA = TypeA 

class MyClass a where 
    myClassFunction :: a -> String 

instance MyClass TypeA where 
    myClassFunction TypeA = "TypeA" 

bar :: (MyClass a) => String -> a 
bar "TypeA" = TypeA 

我收到以下错误:

Couldn't match expected type ‘a’ with actual type ‘TypeA’ 
     ‘a’ is a rigid type variable bound by 
      the type signature for bar :: MyClass a => String -> a 
      at test.hs:9:8 
    Relevant bindings include 
     bar :: String -> a (bound at test.hs:10:1) 
    In the expression: TypeA 
    In an equation for ‘bar’: bar "TypeA" = TypeA 
Failed, modules loaded: none. 

我怕我失去了一些东西约Haskell的类型系统是至关重要的。

+0

该代码的目标是什么? –

+0

@BartekBanachewicz主要尝试使用Haskell类型系统和动态调度(我不确定这是这里的情况) – Saczew

+0

从问题中不清楚你想要动态调度,不。 –

回答

4
(MyClass a) => String -> a 

没有明显的方式,例如,以返回Int类型的值(再次,假定MyClass Int定义)表示函数可以返回任何a类型这是一个从它要求。您的实施返回满足该限制的一个特定类型。这是明确的签名更明显:

bar :: forall a. (MyClass a) => String -> a 

清楚地读出,这是每种类型a满足MyClass,此功能将一个字符串,并返回该类型的值。 您的版本将代替exists a

+0

那么如何实现在他的问题中定义的签名OP? – Glubus

+0

@Glubus我不认为这甚至是可能的。 'MyClass'提供了一种将值减少到'String'的方法,但不是构造'a'类型的新值的方法。问题定义在这里是错误的。 –

+0

有没有一种方法可以在Haskell中实现类似“动态”调度的功能?我的意思是我想在运行时选择功能。我认为如果我像TypeA = ValueA |那样定义,这将是最简单的VALUEB。我只是好奇。 – Saczew

3

函数类型MyClass a => String -> a指示可以返回调用者的选择的任何类型的值(具有MyClass的实例)的函数。给定的值TypeA

相关问题