Как работать с 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
функции как, ну, функции.