Учебники

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 и введите любой символ в двойных или одинарных кавычках.

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

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' 

В сообщении об ошибке «<интерактивный>: 4: 1: за пределами области действия:« a »» компилятор Haskell предупреждает нас, что он не может распознать ваш ввод. Haskell – это тип языка, где все представлено числом.

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

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

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

строка

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

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

Prelude> :t "tutorialspoint.com" 

Он выдаст следующий вывод на экран –

"tutorialspoint.com" :: [Char] 

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

логический

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

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 не может различить «true» и числовое значение, поэтому наш ввод «true» не является числом. Следовательно, компилятор 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]

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

Кортеж

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

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

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

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

Prelude> (1,1,'a') 

Это даст следующий результат –

(1,1,'a') 

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