Хаскелл: Не в области видимости: конструктор данных

#haskell

#haskell

Вопрос:

Сегодня начал изучать haskell для школы, и я столкнулся с проблемой с функцией. Я не понимаю, почему это не в области видимости..

Вот код:

 ff :: [[Char]] -> [[Char]] -> [Char]
ff A B = [[x !! 0, y !! 1] | x <- A, y <- B, (x !! 1) == (y !! 0)]
  

И ошибки:

 md31.hs:2:4: Not in scope: data constructor `A'

md31.hs:2:6: Not in scope: data constructor `B'

md31.hs:2:38: Not in scope: data constructor `A'

md31.hs:2:46: Not in scope: data constructor `B'
  

Заранее спасибо 🙂

Комментарии:

1. Как отмечено в ответах, имена переменных должны быть в нижнем регистре. Официальная документация, связанная с этим, находится по адресу haskell.org/onlinereport/intro.html#namespaces

Ответ №1:

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

Таким образом, вам нужно было бы сделать A и B строчными буквами ( a и b ) в определении вашей функции.

Если первая буква идентификатора находится в верхнем регистре, предполагается, что это конструктор данных.

Ответ №2:

В Haskell заглавные буквы означают, что значение является конструктором данных, как в:

 data Test = A | B
  

Если вам нужна переменная, используйте нижний регистр:

 ff a b = [[x !! 0, y !! 1] | x <- a, y <- b, (x !! 1) == (y !! 0)]