Почему в данном конкретном случае я получаю переменную ошибки, которая не входит в область действия? - PullRequest
0 голосов
/ 06 августа 2020

Когда я создаю файл .hs со следующим кодом и загружаю его в ghci, используя :l, файл загружается, но я получаю сообщение об ошибке <interactive>:1:1: error: Variable not in scope: symbol, если запрашиваю тип symbol. Я знаю, что это означает, что я использую имя, которое не определено в том месте, в котором я пытаюсь его использовать, но я не вижу, что не так с кодом:

module MyData
(MetricUnit(..),
 ImperialUnit(..),
 Measurement(..),
 convert)
 where

data MetricUnit = Meter | Liter | KiloGram
              deriving (Show, Eq)

data ImperialUnit = Yard
                    | Gallon
                    | Pound
                      deriving (Show, Eq)

data Measurement = MetricMeasurement Double MetricUnit
             | ImperialMeasurement Double ImperialUnit
               deriving (Show)

symbol :: MetricUnit -> String
symbol Meter = "m"
symbol Liter = "L"
symbol KiloGram = "kg"

convert (MetricMeasurement x u)
     | u==Meter    = ImperialMeasurement (1.0936*x) Yard
     | u==Liter    = ImperialMeasurement (0.2642*x) Gallon
     | u==KiloGram = ImperialMeasurement (2.2046*x) Pound

convert (ImperialMeasurement x u)
      | u==Yard   = MetricMeasurement (0.9144*x) Meter
      | u==Gallon = MetricMeasurement (3.7854*x) Liter
      | u==Pound  = MetricMeasurement (0.4536*x) KiloGram

Ответы [ 4 ]

1 голос
/ 06 августа 2020

Думаю, проблема в том, что ваш модуль запускается таким образом:

module MyData
    (MetricUnit(..),
     ImperialUnit(..),
     Measurement(..),
     convert)
where

, следовательно, функция symbol не экспортируется модулем.

В GHCi загрузка модуль как ghci MyData.hs из командной строки или как :load MyData из приглашения GHCi должен обойти список экспорта и предоставить вам доступ ко всему.

Вы также можете добавить symbol в список экспорта.

Вы получаете эту ошибку, потому что (я полагаю) вместо этого вы используете другой способ импорта модуля, который не даст вам доступа к неэкспортируемым идентификаторам. Может быть, вы импортируете этот модуль через другой?

1 голос
/ 06 августа 2020

При вводе многострочных элементов в ghci (таких как объявления типов, определения классов, deriving предложения в другой строке) вам необходимо войти в многострочный режим. Вы можете ввести :{, что переведет вас в многострочное приглашение, затем введите свой код, а затем введите :} в другой строке, чтобы выйти из многострочного приглашения. Затем он интерпретирует ваш код как один фрагмент вместо множества строк.

0 голосов
/ 07 августа 2020

Проблема возникла в результате наличия другого файла с таким же именем.

Проблема была решена, когда я создал новый файл с именем fre sh.

0 голосов
/ 06 августа 2020

Я начну с «невозможно воспроизвести»:

% cat <<EOF > ap.hs
heredoc> data MetricUnit = Meter | Liter | KiloGram
       deriving (Show, Eq)

symbol :: MetricUnit -> String
symbol Meter = "m"
symbol Liter = "L"
symbol KiloGram = "kg"
heredoc> EOF
tommd@ovdak /tmp% ghci ap.hs
GHCi, version 8.6.4: http://www.haskell.org/ghc/  :? for help
Loaded package environment from /Users/tommd/.ghc/x86_64-darwin-8.6.4/environments/default
package flags have changed, resetting and loading new packages...
Loaded GHCi configuration from /Users/tommd/.ghci
[1 of 1] Compiling Main             ( ap.hs, interpreted )
Ok, one module loaded.
*Main>

Так что загружается нормально.

Возможно, вы пытаетесь определить код в GHCi вместо загрузки из файла? В этом случае см. Ответ @ Aplet123 о многострочности. В качестве примера неправильного использования GHCi, который вы, возможно, делаете, рассмотрим:

*Main> foo :: Bool

<interactive>:1:1: error: Variable not in scope: foo :: Bool
*Main> foo = True

После ввода первой строки GHCi пытается показать вам foo (print (foo :: Bool)) и не имеет foo он скажет вам, что foo не входит в область действия. Снова посмотрите другой ответ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...