Haskell GHC and HUGS n Haskell 98 is
- Slides: 30
Haskell
GHC and HUGS n Haskell 98 is the current version of Haskell n n GHC (Glasgow Haskell Compiler, version 6. 10. 1) is the version of Haskell I am using n n There is a “Haskell Prime” now available, but not a lot of documentation GHCi is the REPL HUGS is also a popular version n As far as the language is concerned, there are no differences between the two that concern us. 2
Using Haskell n You can do arithmetic at the prompt: n n You can call functions at the prompt: n n Main> sqrt 10 3. 16228 The GHCi documantation says that functions must be loaded from a file: n n Main> 2 + 2 4 Main> : l "test. hs" Reading file "test. hs": But you can define them in GHCI with let n let double x = 2 * x 3
Lexical issues n Haskell is case-sensitive n n Variables begin with a lowercase letter Type names begin with an uppercase letter Indentation matters (braces and semicolons can also be used, but it’s not common) There are two types of comments: n n -- (two hyphens) to end of line {- multi-line {- these may be nested -} -} 4
Types n n Haskell is strongly typed… …but type declarations are seldom needed Primitive types: Int, Float, Char, Bool Lists: [2, 3, 5, 7, 11] n n All list elements must be the same type Tuples: (1, 5, True, 'a') n Tuple elements may be different types 5
Bool Operators n n n Bool values are True and False “And” is infix && “Or” is infix || “Not” is prefix not Functions have types n “Not’ is type Bool -> Bool n “And” and “Or” are type Bool -> Bool 6
Arithmetic on Integers n + - * / ^ are infix operators n n even and odd are prefix operators n n Add, subtract, and multiply are type (Num a) => a -> a Divide is type (Fractional a) => a -> a Exponentiation is type (Num a, Integral b) => a -> b -> a They have type (Integral a) => a -> Bool div, quot, gcd, lcm are also prefix n They have type (Integral a) => a -> a 7
Floating-Point Arithmetic n n + - * / ^ are infix operators, with the types specified previously sin, cos, tan, log, exp, sqrt, log 10 n n pi n n Prefix, type (Floating a) => a -> a Type Float truncate n Type (Real. Frac a, Integral b) => a -> b 8
Operations on Chars n n n These operations require import Data. Char ord is Char -> Int chr is Int -> Char is. Print, is. Space, is. Ascii, is. Control, is. Upper, is. Lower, is. Alpha, is. Digit, is. Alpha. Num are all Int -> Bool A string is just a list of Char, that is, [Char] n "abc" == ['a', 'b', 'c'] 9
Polymorphic Functions n == /= n n < <= >= > n n n Equality and inequality tests are type (Eq a) => a -> Bool Other comparisons are type (Ord a) => a -> Bool show will convert almost anything to a string Any operator can be used as infix or prefix n n (+) 2 2 is the same as 2 + 2 100 `mod` 7 is the same as mod 100 7 10
Operations on Lists I 11
Operations on Lists II 12
Operations on Lists III 13
Operations on Tuples …and nothing else, really. 14
Lazy Evaluation n n No value is ever computed until it is needed Lazy evaluation allows infinite lists Arithmetic over infinite lists is supported Some operations must be avoided 15
Finite and Infinite Lists 16
List Comprehensions I n [ expression_using_x | x <- list ] n n n Example: [ x * x | x <- [1. . ] ] n n read: <expression> where x is in <list> x <- list is called a “generator” This is the list of squares of positive integers take 5 [x*x | x <- [1. . ]] n [1, 4, 9, 16, 25] 17
List Comprehensions II n n [ expression_using_x_and_y | x <- list, y <- list] take 10 [x*y | x <- [2. . ], y <- [2. . ]] n n take 10 [x * y | x <- [1. . ], y <- [1. . ]] n n [4, 6, 8, 10, 12, 14, 16, 18, 20, 22] [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] take 5 [(x, y) | x <- [1, 2], y <- "abc"] n [(1, 'a'), (1, 'b'), (1, 'c'), (2, 'a'), (2, 'b')] 18
List Comprehensions III n n [ expression_using_x | generator_for_x, test_on_x] take 5 [x*x | x <- [1. . ], even x] n [4, 16, 36, 64, 100] 19
List Comprehensions IV n [x+y | x <- [1. . 5], even x, y <- [1. . 5], odd y] n n [x+y | x <- [1. . 5], y <- [1. . 5], even x, odd y] n n [3, 5, 7, 9] [x+y | y <- [1. . 5], x <- [1. . 5], even x, odd y] n [3, 5, 5, 7, 7, 9] 20
Simple Functions n Functions are defined using = n n avg x y = (x + y) / 2 : type or : t tells you the type n n : t avg (Fractional a) => a -> a 21
Anonymous Functions n n Anonymous functions are used often in Haskell, usually enclosed in parentheses x y -> (x + y) / 2 n the is pronounced “lambda” n n n It’s just a convenient way to type the x and y are the formal parameters Functions are first-class objects and can be assigned n avg = x y -> (x + y) / 2 22
Currying n n n Technique named after Haskell Curry Functions have only one argument Currying absorbs an argument into a function f a b = (f a) b, where (f a) is a curried function (avg 6) 8 n 7. 0 23
Slicing n negative = (< 0) Main> negative 5 False Main> negative (-3) True Main> : type negative : : Integer -> Bool Main> 24
Factorial I fact n = if n == 0 then 1 else n * fact (n - 1) This is an extremely conventional definition. 25
Factorial II fact n | n == 0 =1 | otherwise = n * fact (n - 1) Each | indicates a “guard. ” Notice where the equal signs are. 26
Factorial III fact n = case n of 0 -> 1 n -> n * fact (n - 1) This is essentially the same as the last definition. 27
Factorial IV You can introduce new variables with let declarations in expression fact n | n == 0 =1 | otherwise = let m = n - 1 in n * fact m 28
Factorial V You can also introduce new variables with expression where declarations fact n | n == 0 =1 | otherwise = n * fact m where m = n - 1 29
The End (For Now) 30
- Ghc cmu
- Exp haskell
- Higher order function haskell
- Haskell functor
- Msort haskell
- List comprehension haskell
- Haskell data.map
- Haskell linguagem
- Operadores logicos haskell
- Formula do delta
- Haskell adt
- Haskell guards
- Haskell curry function
- Visual studio haskell
- Haskell printf
- Haskell odd
- What is a monad haskell
- Tips for haskell
- Darcs
- Haskell type hierarchy
- Fonksiyonel programlama
- Haskell two dimensional array
- Haskell microcontroller
- Haskell type declaration
- Functor laws haskell
- Haskell higher order functions
- Haskell exercises solutions
- Haskell maybe map
- Clojure haskell
- Haskell bool
- Haskell curry