Хаскелл неявных преобразований - PullRequest
0 голосов
/ 10 октября 2018

Здравствуйте, я хотел использовать Data.Text.intercalate и Hackage Я не понимаю, почему, если метод имеет следующую подпись:

intercalate :: Text -> [Text] -> Text

Почему тогда, это работает

T.intercalate "NI!" ["We", "seek", "the", "Holy", "Grail"]
"WeNI!seekNI!theNI!HolyNI!Grail" 

Разве вы не должны применять Data.Text.pack перед каждым элементом списка?
Источник: http://hackage.haskell.org/package/text-1.2.3.1/docs/Data-Text.html

В моем случае я хочу упаковать следующее:

Ввод : "{", mytext, "}" #mytext::Text
Я делаю это с:
Prelude.intercalate (Data.Text.pack ",") [pack "{",mytext, pack "}"] или

(pack "{") ++ mytext++ pack "}")
Может кто-нибудь объяснить, почему Data.Text предоставляет те же методы, что и Data.List (внаш случай intercalate) и как он делает неявные преобразования между Char и Text?

1 Ответ

0 голосов
/ 10 октября 2018

Вы, вероятно, включили -XOverloadedStrings (или включили его с {-# LANGUAGE OverloadedStrings #-} в верхней части файла).

В результате это означает, что строка литералы (не строковые переменные, только литералы), может интерпретироваться любым типом IsString.

Text является типом IsString.Таким образом, это означает, что вы неявно используете pack вокруг строки литералы (опять-таки литералы, а не обычные переменные).

Подобное происходит с числовыми литералами: числовой литерал может быть любым Num тип.Исходя из того, какие функции вы вызываете для числового литерала, Haskell может получить точный тип и, таким образом, соответствующим образом «интерпретировать» литерал.Например, если вы пишете atan2 1 2, то 1 и 2 должны интерпретироваться как RealFloat типы, тогда как для quot 1 2, 1 и 2 интерпретируются как типы Ìntegral`.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...