Что эта ошибка в регулярном выражении в haskell говорит мне: нет экземпляра для (RegexLike Regex Text), возникающего из-за использования ‘= ~’ - PullRequest
0 голосов
/ 16 апреля 2019

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

Я получаю сообщение об ошибке с синтаксисом регулярных выражений, =~, которое мне не понятно.

Вот мой код:

{-# 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

Поскольку само регулярное выражение работает, я не думаю, что я использую библиотеку регулярных выражений неправильно, хотя именно об этом и говорится в ошибке.

Моя догадка что-то не так вкак я написал свою охрану, но я не могу сказать, что.Что я не так делаю?

...