GHC 6.10.4
Версия реализации GHC языка программирования HaskellВерсия GHC.
Примеры:
Факториал - Haskell (18):
Используется рекурсивное определение факториала. Пример состоит из трех частей:
-
определение функции
factorial
, принимающей на вход один аргумент типаInteger
(целое число неограниченной точности) и имеющей выход того же типа. Функция определяется рекурсивно, тип параметров задан в явном виде, чтобы избежать неоднозначности их определения. -
определение функции
line
, которая выводит на печать число и его факториал в нужном формате. Использование командыprintf
аналогично языку C++. -
собственно вывод чисел и их факториалов. Для этого командой
[0..16]
создается список чисел от 0 до 16, включительно. Функция двух аргументовmap
применяет первый аргумент (функциюline
) к каждому элементу второго аргумента (списка[0..16]
) и в результате создает список так называемых действий вывода (являющихся в Haskell обычными значениями). Для того, чтобы объединить эти действия в одно, используется командаsequence_
, которая, будучи применена к списку действий, выполняет первое действие из списка и затем рекурсивно применяет себя к хвосту списка.
module Main where
import Text.Printf
factorial :: Integer -> Integer
factorial 0 = 1
factorial n = n * factorial (n - 1)
line x = printf "%d! = %d\n" x $ factorial x
main = sequence_ $ map line [0..16]
Hello, World! - Haskell (109):
module Main where
main = do
putStrLn "Hello, World!"
Числа Фибоначчи - Haskell (110):
Этот пример использует одну из основных особенностей языка Haskell — возможность ленивых вычислений и использования бесконечных списков. Бесконечный список чисел Фибоначчи fibs
определяется при помощи фунции zipWith
, которая применяет первый аргумент (функцию двух переменных, в данном случае +
) к парам соответствующих элементов второго и третьего аргументов (списков). tail fibs
возвращает хвост списка fibs
(т.е. все элементы, кроме первого). Таким образом первый элемент списка, возвращаемого zipWith
, является суммой первого и второго элементов списка fibs
и становится третьим его элементом.
module Main where
import Text.Printf
fibs :: [Int]
fibs = 0 : 1 : zipWith (+) fibs (tail fibs)
line n = printf "%d, " $ fibs !! n
main = do
sequence_ $ map line [1..16]
putStrLn "..."
Числа Фибоначчи - Haskell (111):
Этот пример использует рекурсивное определение чисел Фибоначчи через пары соседних чисел в последовательности. На печать выводятся только первые элементы пар.
module Main where
import Text.Printf
fibNextPair :: (Int, Int) -> (Int, Int)
fibNextPair (x, y) = (y, x+y)
fibPair :: Int -> (Int, Int)
fibPair n
| n == 1 = (1, 1)
| otherwise = fibNextPair (fibPair (n-1))
line n = printf "%d, " $ (fst.fibPair) n
main = do
sequence_ $ map line [1..16]
putStrLn "..."
Квадратное уравнение - Haskell (140):
Haskell предоставляет тип данных для работы с комплексными числами. Функция quadratic
принимает в качестве аргумента список трех комплексных чисел (коэффициентов уравнения) и возвращает список корней уравнения. Запись вида root sign
позволяет передать знак операции в качестве аргумента и таким образом обобщить запись двух знаков при квадратном корне из дискриминанта.
module Main where
import Data.Complex
import System.IO (hFlush, stdout)
quadratic :: (Complex Double, Complex Double, Complex Double) -> [Complex Double]
quadratic (0, _, _) = []
quadratic (a, b, c)
| d == 0 = [root (+)]
| otherwise = [root (+), root (-)]
where d = b*b - 4*a*c
root sign = sign (-b) (sqrt d) / (2*a)
main = do
putStr "A = "
hFlush stdout
a <- readLn :: IO Double
putStr "B = "
hFlush stdout
b <- readLn :: IO Double
putStr "C = "
hFlush stdout
c <- readLn :: IO Double
print $ quadratic (realToFrac a, realToFrac b, realToFrac c)
Комментарии
]]>blog comments powered by Disqus
]]>