Data.Text константы в Haskell - PullRequest
       21

Data.Text константы в Haskell

3 голосов
/ 21 сентября 2019

В документации Data.Text есть примеры, например replace "oo" "foo" "oo".Однако, когда я пытаюсь запустить это, он говорит мне, что функция replace ожидала Text, но получила String.Теперь, конечно, я мог бы использовать pack перед каждой константой, чтобы превратить строки в тип Text, но это довольно неудобно.Есть ли способ написать текстовые константы так, как они это делают в документации?

Ответы [ 2 ]

9 голосов
/ 21 сентября 2019

В документации Data.Text для всех примеров включено расширение OverloadedStrings.Это добавит для всех строковых литералов неявный вызов функции fromString.

Например:

$ ghci <b>-XOverloadedStrings</b>
GHCi, version 8.0.2: http://www.haskell.org/ghc/  :? for help
Loaded GHCi configuration from /home/kommusoft/.ghc/ghci.conf
Prelude> import Data.Text
Prelude Data.Text> replace "oo" "foo" "oo"
"foo"

или вы можете добавить это как прагму в свой файл на Haskell:

{-# LANGUAGE <b>OverloadedStrings</b> #-}

import Data.Text

foo = replace "oo" "foo" "oo"

Используя OverloadedString s, вы можете создать свой собственный тип, который работает со строковыми литералами .Например, вы можете сделать тип:

import Data.String

newtype SpecialString = SpecialString String

instance <b>IsString SpecialString</b> where
    fromString = SpecialString

Теперь вы можете использовать строковый литерал, и они могут, в зависимости от контекста, быть преобразованы в SpecialString.

2 голосов
/ 21 сентября 2019

Я проверил документацию, и вы правы - это будет работать, только если вы используете расширение OverloadedStrings GHC.

Позволяет использовать строковые литералы для других "строк-like "types, и это в значительной степени необходимо, если вы интенсивно работаете с Text или ByteString.Я удивлен, что это, кажется, не упомянуто в документации, но ясно предполагается, что OverloadedStrings используется в этих примерах.

...