我刚开始使用 Haskell 和 Yesod,所以如果我遗漏了一些明显的东西,请原谅。
我注意到Yesod.Request .FileInfo 中的 fileContentType 是一个文本,即使Yesod.Content有一个明确的 ContentType。我想知道,为什么它不是 ContentType 而不是最干净的转换?
提前致谢!
我刚开始使用 Haskell 和 Yesod,所以如果我遗漏了一些明显的东西,请原谅。
我注意到Yesod.Request .FileInfo 中的 fileContentType 是一个文本,即使Yesod.Content有一个明确的 ContentType。我想知道,为什么它不是 ContentType 而不是最干净的转换?
提前致谢!
这归结为一个更大的问题。很多 HTTP 规范都是用 ASCII 表示的。问题是,我们如何表示它。基本上有三种选择:
Ascii
围绕 a创建一个特殊的新类型ByteString
。这是最正确的,但也非常乏味,因为它涉及大量的包装/展开。我们尝试了这种方法,得到了很多负面反馈。ByteString
的 s。这是有效的,而且大部分是正确的,但允许人们输入非 ASCII 二进制数据。Text
(或String
)。这是对开发人员最友好的,但允许您输入非 ASCII 字符数据。由于编码/解码开销,它比 (1) 或 (2) 效率低一些。总的来说,对于大多数操作,我们一直在朝着 (3) 前进,尤其是对于 Yesod 内部的会话密钥之类的事情。您可以说这ContentType
是一个不一致的地方,应该改为Text
,但我认为它似乎不会打扰任何人,它更具语义性,而且速度更快。
tl;博士:没有充分的理由:)
您混淆了 of 的类型Content
和 的类型ContentType
。的fileContent
字段FileInfo
应该是- 它是,以类型别名为模 -的ContentType
类型fileContentType
是。将最后一个世界想象成前缀形容词可能会有所帮助,所以== 的类型。Text
ContentTypeType
ContentType
Content