IsString实例不会自动转换为String

时间:2018-02-07 16:27:53

标签: string haskell typeclass

我有一个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。

我还有别的办法来解决编译错误吗?

1 个答案:

答案 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]。由于您的类型可能不是列表,因此无法匹配。