我有一个a
类型,它是IsString
类型类的实例。
如果我使用
之类的东西"foobar" :: a
一切正常。
只要我使用一个返回字符串的函数,就像在
中一样("foo" ++ "bar") :: a
我收到编译错误,告诉我
Couldn't match expected type ‘a’ with actual type ‘[Char]’
Expected type: a
Actual type: String
请注意,我有{-# LANGUAGE OverloadedStrings #-}
pragma。
我还有别的办法来解决编译错误吗?
答案 0 :(得分:4)
IsString
类型类的想法是指定我们可以将String
对象转换为此类对象(使用 fromString :: String -> a
函数)。此外,通过启用OverloadedStrings
编译指示,我们还可以将a
个对象写为字符串文字(在这种情况下,这些String
文字将透明地转换为{{1通过调用a
函数)。
但请注意,fromString
不导致将IsString
转换回a
的方法。此外,String
上定义的函数可以不用于此类实例(至少在没有执行某些实现工作的情况下)。
如果你写:
String
Haskell将派生您调用("foo" ++ "bar") :: a
,因此它知道这些字符串文字的类型是(++) :: [b] -> [b] -> [b]
。这意味着IsString [b] => [b]
。由于您的类型可能不是列表,因此无法匹配。