Если вы работали на Java, вы бы знали, как все классы связаны в папку с именем package . Точно так же Haskell можно рассматривать как набор модулей .
Haskell — это функциональный язык, и все обозначается как выражение, поэтому модуль можно вызывать как набор похожих или связанных типов функций.
Вы можете импортировать функцию из одного модуля в другой модуль. Все операторы «import» должны идти первыми, прежде чем вы начнете определять другие функции. В этой главе мы познакомимся с различными функциями модулей Haskell.
Модуль списка
Список предоставляет несколько замечательных функций для работы с данными типа списка . После того, как вы импортируете модуль List, вы получаете широкий спектр функций.
В следующем примере мы использовали некоторые важные функции, доступные в модуле List.
import Data.List main = do putStrLn("Different methods of List Module") print(intersperse '.' "Tutorialspoint.com") print(intercalate " " ["Lets","Start","with","Haskell"]) print(splitAt 7 "HaskellTutorial") print (sort [8,5,3,2,1,6,4,2])
Здесь у нас есть много функций, даже не определяя их. Это потому, что эти функции доступны в модуле списка. После импорта модуля List компилятор Haskell сделал все эти функции доступными в глобальном пространстве имен. Следовательно, мы могли бы использовать эти функции.
Наш код даст следующий вывод —
Different methods of List Module "T.u.t.o.r.i.a.l.s.p.o.i.n.t...c.o.m" "Lets Start with Haskell" ("Haskell","Tutorial") [1,2,2,3,4,5,6,8]
Чар модуль
Модуль Char имеет множество предопределенных функций для работы с типом символов. Посмотрите на следующий блок кода —
import Data.Char main = do putStrLn("Different methods of Char Module") print(toUpper 'a') print(words "Let us study tonight") print(toLower 'A')
Здесь функции toUpper и toLower уже определены внутри модуля Char . Это даст следующий результат —
Different methods of Char Module 'A' ["Let","us","study","tonight"] 'a'
Модуль карты
Карта — это несортированный тип данных с добавленной стоимостью. Это широко используемый модуль с множеством полезных функций. В следующем примере показано, как можно использовать предопределенную функцию, доступную в модуле «Карта».
import Data.Map (Map) import qualified Data.Map as Map --required for GHCI myMap :: Integer -> Map Integer [Integer] myMap n = Map.fromList (map makePair [1..n]) where makePair x = (x, [x]) main = print(myMap 3)
Это даст следующий результат —
fromList [(1,[1]),(2,[2]),(3,[3])]
Установить модуль
Модуль Set имеет несколько очень полезных предопределенных функций для манипулирования математическими данными. Набор реализован в виде двоичного дерева, поэтому все элементы в наборе должны быть уникальными.
Взгляните на следующий пример кода
import qualified Data.Set as Set text1 = "Hey buddy" text2 = "This tutorial is for Haskell" main = do let set1 = Set.fromList text1 set2 = Set.fromList text2 print(set1) print(set2)
Здесь мы модифицируем строку в набор. Это даст следующий результат. Обратите внимание, что выходной набор не имеет повторения символов.
fromList " Hbdeuy" fromList " HTaefhiklorstu"
Пользовательский модуль
Давайте посмотрим, как мы можем создать собственный модуль, который можно вызывать в других программах. Для реализации этого пользовательского модуля мы создадим отдельный файл с именем «custom.hs» вместе с нашим «main.hs» .
Давайте создадим пользовательский модуль и определим в нем несколько функций.
custom.hs
module Custom ( showEven, showBoolean ) where showEven:: Int-> Bool showEven x = do if x 'rem' 2 == 0 then True else False showBoolean :: Bool->Int showBoolean c = do if c == True then 1 else 0
Наш пользовательский модуль готов. Теперь давайте импортируем его в программу.
main.hs
import Custom main = do print(showEven 4) print(showBoolean True)
Наш код сгенерирует следующий вывод —
True 1
Функция showEven возвращает True , поскольку «4» является четным числом. Функция showBoolean возвращает «1», поскольку булева функция, которую мы передали в функцию, — «True».