Не встроенный конструктор данных
У меня есть два файла .hs: один содержит замедление нового типа, а другой использует его
first.hs:
module first () where
type S = SetType
data SetType = S[Integer]
second.hs:
module second () where
import first
Когда я запускаю second.hs, оба модуля сначала, а второй загружаются просто отлично
Но когда я пишу :type
на платформе Haskell, появляется следующая ошибка
Not in scope : data constructor 'S'
Примечание. В каждом модуле есть определенные функции, я просто пропущу его для ясность вопроса
Ответы
Ответ 1
module first () where
Предполагая, что в действительности имя модуля начинается с буквы верхнего регистра, как и должно быть, пустого списка экспорта - ()
- говорит, что модуль ничего не экспортирует, поэтому вещи, определенные в First
, не находятся в scope в Second
.
Полностью опустить список экспорта для экспорта всех привязок верхнего уровня или перечислить экспортированные объекты в списке экспорта
module First (S, SetType(..)) where
((..)
экспортирует также конструкторы SetType
, без этого, будет экспортирован только тип).
И используйте как
module Second where
import First
foo :: SetType
foo = S [1 .. 10]
Вы также можете отступать на верхний уровень,
module Second where
import First
foo :: SetType
foo = S [1 .. 10]
но это является уродливым, и можно получить ошибки из-за ошибочного изъятия отступа.
Ответ 2
- Имена модулей начинаются с капитала - Haskell чувствителен к регистру
- Выровняйте свой код в левом поле - макет имеет важное значение в Haskell.
- Бит в скобках - это список экспорта - пропустите его, если вы хотите экспортировать все функции или поместить все, что вы хотите экспортировать в нем.
First.hs
:
module First where
type S = SetType
data SetType = S[Integer]
Second.hs
:
module Second where
import First