Как избежать преобразования между различными типами строк в haskell с помощью snapframework?

Я хочу получить декодированный результат для данных POST. Много кода «тратится впустую» при преобразовании «строки». Это делает код уродливым. Любые лучшие решения?

import           Codec.Binary.Url (decode')
import qualified Data.ByteString.Lazy.Char8 as L (unpack)
import qualified Data.ByteString.Char8 as S (unpack, pack)
import qualified Data.ByteString.Lazy as LBS (pack)

decodeUrlHandler :: Snap()
decodeUrlHandler = do
    body <- readRequestBody (maxBound :: Int64)
    writeLBS $ LBS.pack $ map (fromMaybe 0) $ decode' $ L.unpack body

Каким будет ваш код для этой цели?


person wenlong    schedule 18.11.2011    source источник
comment
Может быть, добавить свою функцию fromMaybeW8sToLBS = LBS.pack . map (fromMaybe 0)   -  person wenlong    schedule 18.11.2011
comment
Зачем вам нужно декодировать тело запроса самостоятельно? Вы уверены, что Snap не сделает это за вас?   -  person nponeccop    schedule 18.11.2011
comment
@nponeccop, тело запроса имеет тип ByteString, я хочу рассматривать его как закодированную строку URL и декодировать ее. Но декодирование (декодирование URL) требует String и возвращает [Maybe Word8].   -  person wenlong    schedule 18.11.2011


Ответы (1)


Snap автоматически декодирует запрос и делает его доступным для вас через Запрос типа данных. Он предоставляет функции getRequest. и withRequest для получения запрос и ряд других функций доступа для получения различных частей.

Есть также удобные функции для обычных операций. Чтобы получить параметр POST или GET, см. получитьпараметр.

Snap предоставляет его вам как ByteString, потому что этот API находится на довольно низком уровне абстракции, оставляя на усмотрение пользователя, как обращаться с такими вещами, как кодирование текста. Я бы порекомендовал вам использовать гораздо более эффективный тип Text вместо String. Класс типа Readable также предоставляет механизм для устранения некоторых шаблонов этих преобразований. Экземпляры по умолчанию для чисел и текста предполагают кодировку UTF8.

person mightybyte    schedule 18.11.2011
comment
Я поддерживаю предложение использовать Data.Text вместе с {-# LANGUAGE OverloadedStrings #-}, если вы еще этого не сделали. Вы также можете обнаружить, что вам нужно «импортировать Data.String (IsString)» для некоторых преобразований, но Snap делает это довольно просто. - person clintm; 18.11.2011
comment
Если я использую тип Text, мне нужно дополнительное преобразование для применения некоторых функций, которые принимают тип String, в данном случае Codec.Binary.Url.decode'. - person wenlong; 19.11.2011
comment
Это также делает функция fromBS, предоставляемая классом типов Readable. - person mightybyte; 21.11.2011