Я делаю парсерную функцию для небольших строк, содержащих информацию о валюте.
Я получаю сообщение об ошибке с синтаксисом регулярных выражений, =~
, которое мне не понятно.
Вот мой код:
{-# LANGUAGE DeriveGeneric, OverloadedStrings, FlexibleContexts, RankNTypes, KindSignatures, DataKinds #-}
import Data.Time
import Data.Text as T
import Text.Regex.PCRE
data Currency = USD | EUR | JPN deriving (Show, Generic)
-- -- Currency part
cparse :: Text -> Currency
cparse raw
| (raw =~ "^\\$" :: Bool) = USD
| (raw =~ "^¥" :: Bool) = JPN
| (raw =~ "^€" :: Bool) = EUR
| (raw =~ "USD$" :: Bool) = USD
| (raw =~ "JPN$" :: Bool) = JPN
| (raw =~ "EUR$" :: Bool) = EUR
| otherwise = USD
Мои тесты для этих условий работают как положено:
Prelude Text.Regex.PCRE> ("$12" =~ "^\\$" :: Bool)
True
Prelude Text.Regex.PCRE> ("¥12" =~ "^\\$" :: Bool)
False
Prelude Text.Regex.PCRE> ("¥12" =~ "^¥" :: Bool)
True
Prelude Text.Regex.PCRE> ("12USD" =~ "USD$" :: Bool)
True
Prelude Text.Regex.PCRE> ("12USF" =~ "USD$" :: Bool)
False
Но когда я пытаюсь определить эту функцию, вот моя ошибка:
<interactive>:14:8: error:
• No instance for (RegexLike Regex Text) arising from a use of ‘=~’
• In the expression: (raw =~ "^\\$" :: Bool)
In a stmt of a pattern guard for
an equation for ‘cparse’:
(raw =~ "^\\$" :: Bool)
In an equation for ‘cparse’:
cparse raw
| (raw =~ "^\\$" :: Bool) = USD
| (raw =~ "^¥" :: Bool) = JPN
| (raw =~ "^€" :: Bool) = EUR
| (raw =~ "USD$" :: Bool) = USD
| (raw =~ "JPN$" :: Bool) = JPN
| (raw =~ "EUR$" :: Bool) = EUR
| otherwise = USD
Поскольку само регулярное выражение работает, я не думаю, что я использую библиотеку регулярных выражений неправильно, хотя именно об этом и говорится в ошибке.
Моя догадка что-то не так вкак я написал свою охрану, но я не могу сказать, что.Что я не так делаю?