Haskell - Базовые модели данных

Haskell - это чисто функциональный язык программирования, поэтому он намного более интерактивен и интеллектуален, чем другие языки программирования. В этой главе мы узнаем об основных моделях данных Haskell, которые на самом деле предопределены или каким-то образом разумно декодированы в память компьютера.

В этом руководстве мы будем использовать онлайн-платформу Haskell, доступную на нашем веб-сайте (https://www.tutorialspoint.com/codingground.htm).

Числа

Haskell достаточно умен, чтобы расшифровать некоторое число как число. Следовательно, вам не нужно указывать его тип извне, как мы обычно делаем в случае других языков программирования. В качестве примера перейдите в командную строку прелюдии и просто запустите «2 + 2» и нажмите Enter.

sh-4.3$ ghci 
GHCi, version 7.6.3: http://www.haskell.org/ghc/  :? for help 
Loading package ghc-prim ... linking ... done. 
Loading package integer-gmp ... linking ... done. 
Loading package base ... linking ... done. 
Prelude> 2+2

В результате вы получите следующий результат.

4

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

Теперь давайте попробуем немного более сложные математические вычисления и посмотрим, дает ли наш интеллектуальный компилятор правильный результат или нет. Попробуйте с "15+ (5 * 5) -40"

Prelude> 15+(5*5)-40

Вышеприведенное выражение дает "0" в соответствии с ожидаемым результатом.

0

Символы

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

Давайте предоставим следующую строку в качестве ввода и проверим ее вывод.

Prelude> :t "a"

Он выдаст следующий результат -

"a" :: [Char]

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

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

Prelude> :t a 
<interactive>:1:1: Not in scope: 'a'  

Prelude> a 
<interactive>:4:1: Not in scope: 'a'

Сообщением об ошибке «<interactive>: 4: 1: Not in scope:` a '»компилятор Haskell предупреждает нас, что он не может распознать ваш ввод. Haskell - это тип языка, в котором все представлено числом.

Haskell следует традиционному стилю кодирования ASCII. Давайте посмотрим на следующий пример, чтобы понять больше -

Prelude> '\97' 
'a'  
Prelude> '\67' 
'C'

Посмотрите, как ваш ввод декодируется в формат ASCII.

Строка

А stringне что иное, как набор персонажей. Не существует специального синтаксиса для использования строки, но Haskell следует обычному стилю представления строки в двойных кавычках.

Взгляните на следующий пример, где мы передаем строку «Tutorialspoint.com».

Prelude> :t "tutorialspoint.com"

На экране появится следующий вывод:

"tutorialspoint.com" :: [Char]

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

Булево

Тип данных Boolean также довольно прост, как и другие типы данных. Посмотрите на следующий пример, где мы будем использовать различные логические операции с использованием некоторых логических входов, таких как «Истина» или «Ложь».

Prelude> True && True 
True  
Prelude> True && False 
False   
Prelude> True || True 
True  
Prelude> True || False 
True

В приведенном выше примере нам не нужно упоминать, что «True» и «False» являются логическими значениями. Сам Haskell может его декодировать и выполнять соответствующие операции. Давайте изменим наши входные данные на «истина» или «ложь».

Prelude> true

Он выдаст следующий результат -

<interactive>:9:1: Not in scope: 'true'

В приведенном выше примере Haskell не мог различить «истину» и числовое значение, поэтому наш ввод «истина» не является числом. Следовательно, компилятор Haskell выдает ошибку, заявляя, что наш ввод не является его областью.

Список и понимание списка

Как и другие типы данных, Listтакже очень полезный тип данных, используемый в Haskell. Например, [a, b, c] - это список символов, следовательно, по определению List - это набор данных того же типа, разделенных запятой.

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

Взгляните на следующий пример, который показывает, как Haskell обрабатывает список.

Prelude> [1,2,3,4,5]

Он выдаст следующий результат -

[1,2,3,4,5]

Списки в Haskell однородны по своей природе, что означает, что они не позволяют вам объявлять список с разными типами данных. Любой список вроде [1,2,3,4,5, a, b, c, d, e, f] вызовет ошибку.

Prelude> [1,2,3,4,5,a,b,c,d,e,f]

Этот код приведет к следующей ошибке -

<interactive>:17:12: Not in scope: 'a' 
<interactive>:17:14: Not in scope: 'b' 
<interactive>:17:16: Not in scope: 'c' 
<interactive>:17:18: Not in scope: 'd' 
<interactive>:17:20: Not in scope: 'e' 
<interactive>:17:22: Not in scope: 'f'

Понимание списка

Понимание списка - это процесс создания списка с использованием математического выражения. Посмотрите на следующий пример, в котором мы генерируем список с использованием математического выражения в формате [output | ассортимент, состояние].

Prelude> [x*2| x<-[1..10]] 
[2,4,6,8,10,12,14,16,18,20]  
Prelude> [x*2| x<-[1..5]] 
[2,4,6,8,10]  
Prelude> [x| x<-[1..5]] 
[1,2,3,4,5]

Этот метод создания одного списка с использованием математического выражения называется List Comprehension.

Кортеж

Haskell предоставляет еще один способ объявления нескольких значений в одном типе данных. Он известен какTuple. Кортеж можно рассматривать как список, однако между кортежем и списком есть некоторые технические различия.

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

С другой стороны, List является однородным типом данных, но Tuple неоднороден по своей природе, потому что Tuple может содержать внутри себя данные другого типа.

Кортежи представлены одинарными скобками. Взгляните на следующий пример, чтобы увидеть, как Haskell обрабатывает кортеж.

Prelude> (1,1,'a')

Он выдаст следующий результат -

(1,1,'a')

В приведенном выше примере мы использовали один кортеж с двумя number переменные типа, а char тип переменная.