Не удалось совместить ожидаемый тип "Текст" с фактическим типом `[Char] '

Это может быть действительно нубийский вопрос, но я не могу преодолеть эту проблему (поскольку я только начал изучать Haskell).

У меня есть простой блок кода:

module SomeTest where
import Data.Text

str =  replace "ofo" "bar" "ofofo"

Если я назову это с помощью str, я получаю:

<interactive>:108:19: error:
* Couldn't match expected type `Text' with actual type `[Char]'
* In the first argument of `Data.Text.replace', namely `"ofo"'
  In the expression: Data.Text.replace "ofo" "bar" "ofofo"
  In an equation for `it': it = Data.Text.replace "ofo" "bar" "ofofo"

<interactive>:108:25: error:
* Couldn't match expected type `Text' with actual type `[Char]'
* In the second argument of `Data.Text.replace', namely `"bar"'
  In the expression: Data.Text.replace "ofo" "bar" "ofofo"
  In an equation for `it': it = Data.Text.replace "ofo" "bar" "ofofo"

<interactive>:108:31: error:
* Couldn't match expected type `Text' with actual type `[Char]'
* In the third argument of `Data.Text.replace', namely `"ofofo"'
  In the expression: Data.Text.replace "ofo" "bar" "ofofo"
  In an equation for `it': it = Data.Text.replace "ofo" "bar" "ofofo"

Я не знаю, почему я получаю эту ошибку и как ее передать. Является ли Text просто синонимом [Char]?

Ответ 1

К сожалению, Haskell имеет несколько конфликтующих типов для строк символов. Строковые литералы обычно имеют тип String, который является просто псевдонимом для [Char]. Поскольку это неэффективное представление строк, существуют альтернативы, такие как Text.

В вашем случае добавление {-# LANGUAGE OverloadedStrings #-} в качестве первой строки вашей программы сделает компиляцию. В основном ваши строковые литералы могут быть типа Text, затем.

Ответ 2

В моем случае у меня был код, который делал объединение значений String и Text:

"cd " ++ stackProjectLocation

"cd " имел тип Text из-за использования {-# LANGUAGE OverloadedStrings #-}

И stackProjectLocation был строкой

Решением было использовать (<>) :: Semigroup a => a -> a -> a:

"cd " <> stackProjectLocation