Haskell中的刚性类型变量

时间:2017-05-29 13:10:50

标签: 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类型系统的重要内容。

2 个答案:

答案 0 :(得分:5)

(MyClass a) => String -> a

表示该函数可以返回从中询问的任何 a类型。您的实现返回满足该约束的一个特定类型。使用显式签名更明显:

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

明白地说明,对于满足a的每个类型MyClass,此函数将获取一个字符串并返回该类型的值。 您的版本将改为exists a

答案 1 :(得分:3)

函数类型<select id="currency" name="currency" class="form-control"> <option value="">Select currency</option> <% for(var i=0; i<data.length; i++) {%> <option value="<%=data[i].currency%>"><%=data[i].currency%></option> <% } %> </select> 表示一个函数,它可以返回调用者的选择的任何类型的值(MyClass a => String -> a的实例)。例如,在给定值MyClass

的情况下,没有明显的方法可以返回Int类型的值(同样,假定已定义MyClass Int