Мне нужно работать со строгими и ленивыми ByteStrings, потому что это требование задано выбором библиотек (некоторые сочетания happstack, base64, sha256, hexpat и т. Д.). После некоторых танцев с «fromStrict» и аналогичным я закончил с этим:Легкий переход между ленивым и строгим ByteString
import qualified Data.ByteString.Char8 as S
import qualified Data.ByteString.Lazy.Char8 as L
class BString s where
lazy :: s -> L.ByteString
strict :: s -> S.ByteString
pack :: String -> s
text :: T.Text -> s
instance BString L.ByteString where
lazy = id
strict = S.concat . L.toChunks
pack = L.pack
text = L.fromStrict . TE.encodeUtf8
instance BString S.ByteString where
lazy = L.fromStrict
strict = id
pack = S.pack
text = TE.encodeUtf8
так что я просто положить «ленивый $», когда функция библиотеки в руках требует ленивых строк байт или «строгих $» в случае строгого версия. Это прекрасно работает, хотя и требует редкого обращения, но мне кажется, что я изобрел велосипед здесь.
Итак, вопрос в том, есть ли более эффективная (более короткая, статически типизированная, более эффективная) альтернатива такому коду? Есть ли библиотека, пытающаяся унифицировать ленивую/строгую обработку? Или, может быть, я делаю неправильно, и это считается плохой практикой (ты не должен переходить между ленивым и строгим или что-то еще)?
Спасибо.
Ну, теоретически это может сработать, но мое намерение - это обратное: уменьшить количество кода, который я должен написать. И в некотором смысле «ленивый strictString» уже является достаточно хорошим адаптационным слоем. –
Посмотрите на пакет [stringable] (https://hackage.haskell.org/package/stringable). – ErikR