我真的不明白以下代码的错误。
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 :(得分: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
)