我为基本的参数多态构建了一个简单的类接口:
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
,反之亦然?
答案 0 :(得分:3)
CORS(app, resources={r"/*": {"origins": "*"}})
和[Char]
之间绝对没有区别。后者被定义为类型别名/同义词:
String
两者都是懒惰的链接字符列表。对于其他表示,有type String = [Char]
表示具有连续数组的字符串(如C中所示,粗略但可识别Unicode)。我们还有Text
但它不适合字符串,尽管名称:这是一个连续的字节数组,可以保存二进制数据。然后,您需要解码此类二进制数据以获得真正的Unicode字符串。如果您知道您的字符是latin-1编码的,则可以使用ByteStrings
,但对于现在的实际应用程序,应该可以使用Unicode。