理解String对[Char]的影响?

时间:2017-03-01 07:58:51

标签: haskell types

我为基本的参数多态构建了一个简单的类接口:

class Document a where
  present :: a -> b -> Bool

instance Document String where
  present s o = False

instance Document Int where
  present i o = True

implementation :: Document a => a -> Int -> Bool
implementation v int | int > 10           = present v
                     | otherwise          = False

据我所知,当Document限制参数的数字参数时,您需要指定其类型:

print $ implementation (22 :: Int) 400

我的理解是,这是因为编译器不知道22是Int还是Float

但是,我发现这同样适用于字符串:

print $ implementation ("mystring" :: String) 400

再次,区分String[Char]。但是,我真的不明白这些之间的实际差异吗?

我假设Haskell编译器行为类似于C / C ++,其中所有类型的String在编译时都转换为[Char] - 这不是这种情况吗?

为什么会使用[Char]而不是String,反之亦然?

1 个答案:

答案 0 :(得分:3)

CORS(app, resources={r"/*": {"origins": "*"}})[Char]之间绝对没有区别。后者被定义为类型别名/同义词:

String

两者都是懒惰的链接字符列表。对于其他表示,有type String = [Char] 表示具有连续数组的字符串(如C中所示,粗略但可识别Unicode)。我们还有Text但它不适合字符串,尽管名称:这是一个连续的字节数组,可以保存二进制数据。然后,您需要解码此类二进制数据以获得真正的Unicode字符串。如果您知道您的字符是latin-1编码的,则可以使用ByteStrings,但对于现在的实际应用程序,应该可以使用Unicode。