2016-01-08 2 views
1

Я пытаюсь создать тип для простых пар ключ/значение, которые могут быть преобразованы в URL-запрос. Таким образом, я создал следующий ADT:Почему функция showList Haskell возвращает ShowS

data Target where 
    (:=>) :: String -> String -> Target 

instance Show Target where 
    show (a :=> b) = a ++ "=" ++ b 
    showList (xs) = (\y -> intercalate "&" $ map show xs) 

Когда я запускаю его в GHCI работает точно так, как я хочу:

ghci>["id" :=> "123", "color" :=> "red"] 
id=123&color=red 
it :: [Target] 

Мой вопрос: Зачем мне нужен лямбда в showList? Я попробовал show y, и он просто печатает пустую строку. Какова цель возврата ShowS, когда аргумент просто пуст? Или, может быть, лучший вопрос, к какой функции showS применяется в этом случае?

ответ

1

ShowS существует, чтобы обеспечить оптимизацию конкатенации и конкатенации по составу. См. this Stack Overflow answer для получения дополнительной информации о ShowS.

Для примера, вместо того, чтобы игнорировать y, вы можете сохранить преимущество конкатенации с чем-то вроде этого:

showList (xs) = ((intercalate "&" $ map show xs) ++) 
Смежные вопросы