2

https://github.com/xich/scotty/issues/26

https://github.com/xich/scotty/pull/27

class ScottyString a where
  toContent :: a -> Content
  toText :: a -> T.Text
  fromScotty :: T.Text -> a

instance ScottyString B.ByteString where
  toContent bs = ContentBuilder (fromByteString bs)
  toText bs = toText $ BL.fromChunks [bs]
  fromScotty = B.concat . BL.toChunks . fromScotty

instance ScottyString BL.ByteString where
  toContent bs = ContentBuilder (fromLazyByteString bs)
  toText = decodeUtf8
  fromScotty = encodeUtf8

instance ScottyString T.Text where
  toContent = toContent . encodeUtf8
  toText = id
  fromScotty = id

instance ScottyString String where
  toContent = toContent . T.pack
  toText = T.pack
  fromScotty = T.unpack

对我来说它工作得很好,但是旧代码被破坏了......因为现在某些函数没有默认类型。

如何为此类型类添加默认类型(例如Text)?

4

2 回答 2

4

顺便说一句,我在 hackage 上开始了一个几乎相同的 Stringable 类型类:http: //hackage.haskell.org/package/stringable

写是因为我厌倦了必须记住如何将所有内容相互转换。

于 2012-09-27T05:46:47.170 回答
2

类型类没有默认类型。有一个默认类型的“全局”列表,可以使用default声明进行修改,但是这仅适用于数字类型并且仅影响当前模块,以及其他限制。有关详细信息,请参阅Haskell 报告

您也许可以使用 GHC 一起破解某些东西ExtendedDefaultRules,但我建议您尝试以其他方式解决歧义,例如通过定义具有更多约束类型的辅助函数。

于 2012-09-26T08:51:34.567 回答