为什么Yesod.Request.FileInfo(fileContentType)是一个文本?

时间:2012-01-24 18:08:30

标签: haskell yesod

我刚刚开始使用Haskell和Yesod所以请原谅我是否遗漏了明显的东西。

我注意到Yesod.Request中的fileContentType。即使Yesod.Content具有显式的ContentType,FileInfo也是文本。我想知道,为什么它不是ContentType而是什么是最干净的转换?

提前致谢!

2 个答案:

答案 0 :(得分:2)

这归结为一个更大的问题。很多HTTP规范都用ASCII表示。问题是,我们如何代表它。基本上有三种选择:

  1. 围绕Ascii创建一个特殊的新类型ByteString。这是最正确的,但也非常繁琐,因为它涉及大量的包装/展开。我们尝试了这种方法,并得到了很多负面反馈。
  2. 使用普通ByteString s。这是有效的,而且大多是正确的,但允许人们输入非ASCII二进制数据。
  3. 使用Text(或String)。这是开发人员最友好的,但允许您输入非ASCII字符数据。由于编码/解码开销,它的效率低于(1)或(2)。
  4. 总的来说,我们一直在为(3)大多数操作而努力,尤其是像Yesod内部的会话键这样的事情。您可以说ContentType是不一致的,应该更改为Text,但我认为这似乎不会打扰任何人,更具语义性,更快一点。

    tl;博士:没有充分理由:)

答案 1 :(得分:0)

您已将Content的类型与ContentType的类型混淆。 fileContent的{​​{1}}字段应为FileInfo - 它是模式别名的模数 - ContentType的类型为fileContentType,{{1} }}。它可能有助于将上一个世界成像为前缀形容词,因此Text == ContentTypeType的类型。