Scotty Convert GET Parameter/Lazy.Text преобразование

Я пытаюсь передать параметр GET в функцию и объединить строку из результата

{-# LANGUAGE OverloadedStrings #-}
module Main where
import Data.Monoid ((<>))
import Web.Scotty

f x = x <> x
main = do
  scotty 3000 $ do
    get "/f/:x" $ do
        x <- param "x"
        text ("f(" <> x <> ") = " <> f x)

Чтобы сделать мое приложение еще более интересным, я хочу использовать функцию, для которой требуется экземпляр типа аргумента Num, например.

f x = x * x

Как я могу преобразовать/прочитать x в Num (или Maybe...) и преобразовать результат функции обратно в Data.Text.Internal.Lazy.Text?

Я старался

text ("f(" <> x <> ") = " <> (show $ f $ read x))

что дает ошибки:

• Couldn't match expected type
  ‘text-1.2.3.1:Data.Text.Internal.Lazy.Text’
  with actual type ‘[Char]’

person Nicolas Heimann    schedule 09.10.2018    source источник
comment
Text не то же самое, что String, и это укусило многих людей, не только в Haskell. Скорее всего, вам потребуется import qualified Data.Text as T, а затем использовать функцию T.pack для преобразования String (т.е., [Char]) в формат Data.Text.   -  person Bob Dalgleish    schedule 09.10.2018


Ответы (1)


Спасибо Бобу Далглишу (комментарии) за помощь в решении этой проблемы, с функциями pack/unpack я смог решить ситуацию.

{-# LANGUAGE OverloadedStrings #-}
module Main where
import Data.Monoid ((<>))
import qualified Data.Text as T
import qualified Data.Text.Lazy as L
import Web.Scotty

f x = x * x
main = do
  scotty 3000 $ do
    get "/f/:x" $ do
        x <- param "x"
        let res_string = show $ f $ read $ T.unpack x
        let label_string = "f(" <> (T.unpack x) <> ") = "
        text $ L.pack (label_string <> res_string)

Обратите внимание, что read является «опасным» и его нельзя заменять на readMaybe, но здесь это не по теме.

person Nicolas Heimann    schedule 10.10.2018