Как работать с Regex и OverloadedString

Я использую Text.Regex.Posix в файле все работает отлично до сих пор. Теперь я хотел бы использовать OverloadedStrings для чего-то еще, но в том же файле. Проблема в том, когда я активирую OverloadedString весь код, связанный с regex не компилируется, потому что строки становятся неоднозначными.

Есть ли способ справиться с этим без необходимости добавлять сигнатуру типа в каждую строку или деактивировать OverloadedStrings?

1 ответ

Решение

Я вижу два подхода здесь. Вы можете сделать некоторую перестановку импорта и просто присвоить псевдониму функции, которые вам нужны, чтобы иметь менее общие типы, такие как

import qualified Text.Regex.Posix as P
import Text.Regex.Posix hiding ((=~))

(=~) :: RegexContext Regex String target => String -> String -> target
(=~) = (P.=~)

Тогда вам не нужно менять код в вашем файле. Это может привести к путанице, хотя и требует FlexibleContexts работать (не имеет большого значения).

В качестве альтернативы вы можете создать свой собственный Python-подобный синтаксис для указания типа:

r :: String -> String
r = id

u :: Text -> Text
u = id

b :: ByteString -> ByteString
b = id

example :: Bool
example = r"test" =~ r"te.t"

splitComma :: Text -> Text
splitComma = Data.Text.splitOn (u",")

Но это потребует от вас редактирования большего количества кода. Он не использует никаких дополнительных языковых расширений, и код для его реализации очень прост, даже по сравнению с первым методом. Это также означает, что вам придется использовать скобки или $ знаки, но вы также можете использовать r, u, а также b функции как, ну, функции.

Другие вопросы по тегам