Haskell
Table of Contents
1. commands
1.1. in file.hs
C-c C-l to execute file.hs and go to interactive environment Seeing ./black.hs
1.2. C-c C-c call in src
log2 :: Float -> Float log2 = logBase 2 log2 43
with :results value :eval (inferior-haskell-start-process)
in src can multi functions be defined. and the last call will be printed
with follow extension, can be easy C-c C-c executed, but not in send to haskell log file, but only output the last result
Seeing Literatur Programm Grundlage
1.3. send to haskell/org-src-block
log2 :: Float -> Float log2 = logBase 2 log2 43
#+endsrc
first to load file. ~/.emacs.d/packages/orgmode-babal-haskell.el in one of src block M-x : send to haskell/org-src-block
in src block without any extension can be load in send buffer(after _src haskell), and the be called function can be many type.
important : in src block the calling syntax is NOT allowed
Seeing Literatur Programm Alternativen
2. Functional Programm
2.1. Grundlage
basic function call
log2 :: Float -> Float log2 = logBase 2 log2 43
implication
(==>):: Bool -> Bool -> Bool a ==> b = not a || not b Flase ==> True False==> False True ==> True
–euler numbers
e:: Float e = exp 1 e
2.2. Pattern Matching
one of the calling must match one case of pattern
(<#>) :: Bool -> Bool -> Bool (<#>) False False = False (<#>) False True = True (<#>) True False = True (<#>) True True = True True <#> True
(<#>) :: Bool -> Bool -> Bool (<#>) True True = True (<#>) _ _ = False (<#>) True True (<#>) False True
(<#>) :: Bool -> Bool -> Bool (<#>) True True
case : this can only be executed in a .hs file, in orgmode can NOT be imported, I don't know what is going on in Terminal can NOT also
Here I made above mistake, this is no sense. so long the indentation is correct, so works
(<#>) :: Bool -> Bool -> Bool (<#>) a b | a == b = False | otherwise = True
2.3. Alternativen
if else then
absolute :: Int -> Int absolute x = if x < 0 then -x else x
2.4. Recursion
easy fib
heronA ::(Int, Double) -> Double heronA (n,a) | n > 0 = (heronA(n-1,a) + a/heronA(n-1, a))/2 | otherwise = a absolute :: Int -> Int absolute x = if x < 0 then -x else x heronB :: Int -> Double -> Double heronB n a | n > 0 = (heronB (n-1) a + a/heronB(n-1) a)/2 | otherwise = a
where
heronC :: Int -> Double -> Double heronC n a |n > 0 = (x + a/x)/2 |otherwise = a where x = heronC (n-1) a
fib & where
fibA :: Int -> Int fibA n |n == 0 = 0 |n == 1 = 1 |otherwise = x +y where x = fibA (n-1) y = fibA (n-2)
fib & where & pattern matching
fibB :: Int -> Int fibB 0 = 0 fibB 1 = 1 fibB n = fibB (n-1) + fibB (n-2) fibC :: Int -> Int fibC 0 = 0 fibC 1 = 1 fibC n | n < 0 = error "illegal arguement" | otherwise = fibB (n-1) + fibB (n-2) (<##>) :: Int -> Double -> Double 0 <##> a = a n <##> a | n > 0 = (x + a/x)/2 | otherwise = error "illegal arguement" where x = (n-1) <##> a
2.5. Type conversion1
Guides
vielleichtdreifach :: Bool -> Bool -> Integer -> Integer vielleichtdreifach verdreifach nochmal n | verdreifach && nochmal = maldrei ( maldrei n) | verdreifach = maldrei n | otherwise = n where maldrei n = 3*n dreifach :: Integer -> Integer dreifach = vielleichtdreifach True False neudreifach :: Integer -> Integer neudreifach = vielleichtdreifach True True
vielleichtdreifach Bool Bool -> Integer
2.6. Factorial
fac :: Integer -> Integer fac n | n == 0 = 1 | otherwise = fac (n-1) * n
2.7. Stern Brocot Floge
\(\\s_{0} = 0 \\ s_{1} = 1 \\ s_{2n} = s_{n} \\ s_{2n+1} = s_{n} + s_{n+1}\)
(*/*) :: Integer -> Integer -> Integer (*/*) = div (*%*) :: Integer -> Integer -> Integer (*%*) = rem sternBrocot :: Integer -> Integer sternBrocot n | n == 0 = 0 | n == 1 = 1 | n *%* 2 == 0 = sternBrocot half | otherwise = sternBrocot half + sternBrocot (half + 1) where half = n */* 2 suche :: Integer -> Integer -> Integer suche suchziel postionziel | sternBrocot postionziel > suchziel = postionziel | otherwise = suche suchziel (postionziel +1)
3. List
字符串就是单一字符的列表
3.1. List add
in prelude
[1,2,3] ++ [3,4,5] 2 : [3,4]
4. Symbol
需要时刻谨记是用 . 来做函数组合的,$ 是用来降低函数执行优先级的。
5. Functional Programm of Haskell
5.1. Grundlage
basic function call
log2 :: Float -> Float log2 = logBase 2 log2 43
implication
(==>):: Bool -> Bool -> Bool a ==> b = not a || not b Flase ==> True False==> False True ==> True
–euler numbers
e:: Float e = exp 1 e
5.2. Pattern Matching
one of the calling must match one case of pattern
(<#>) :: Bool -> Bool -> Bool (<#>) False False = False (<#>) False True = True (<#>) True False = True (<#>) True True = True True <#> True
(<#>) :: Bool -> Bool -> Bool (<#>) True True = True (<#>) _ _ = False (<#>) True True (<#>) False True
(<#>) :: Bool -> Bool -> Bool (<#>) True True = True
case : this can only be executed in a .hs file, in orgmode can NOT be imported, I don't know what is going on in Terminal can NOT also
Here I made above mistake, this is no sense. so long the indentation is correct, so works
(<#>) :: Bool -> Bool -> Bool (<#>) a b | a == b = False | otherwise = True
5.3. Alternativen
if else then
absolute :: Int -> Int absolute x = if x < 0 then -x else x
5.4. Recursion
easy fib
heronA ::(Int, Double) -> Double heronA (n,a) | n > 0 = (heronA(n-1,a) + a/heronA(n-1, a))/2 | otherwise = a absolute :: Int -> Int absolute x = if x < 0 then -x else x heronB :: Int -> Double -> Double heronB n a | n > 0 = (heronB (n-1) a + a/heronB(n-1) a)/2 | otherwise = a
where
heronC :: Int -> Double -> Double heronC n a |n > 0 = (x + a/x)/2 |otherwise = a where x = heronC (n-1) a
fib & where
fibA :: Int -> Int fibA n |n == 0 = 0 |n == 1 = 1 |otherwise = x +y where x = fibA (n-1) y = fibA (n-2)
fib & where & pattern matching
fibB :: Int -> Int fibB 0 = 0 fibB 1 = 1 fibB n = fibB (n-1) + fibB (n-2) fibC :: Int -> Int fibC 0 = 0 fibC 1 = 1 fibC n | n < 0 = error "illegal arguement" | otherwise = fibB (n-1) + fibB (n-2) (<##>) :: Int -> Double -> Double 0 <##> a = a n <##> a | n > 0 = (x + a/x)/2 | otherwise = error "illegal arguement" where x = (n-1) <##> a
5.5. type conversion
Guides
vielleichtdreifach :: Bool -> Bool -> Integer -> Integer vielleichtdreifach verdreifach nochmal n | verdreifach && nochmal = maldrei ( maldrei n) | verdreifach = maldrei n | otherwise = n where maldrei n = 3*n dreifach :: Integer -> Integer dreifach = vielleichtdreifach True False neudreifach :: Integer -> Integer neudreifach = vielleichtdreifach True True
vielleichtdreifach Bool Bool -> Integer
5.6. Factorial
fac :: Integer -> Integer fac n | n == 0 = 1 | otherwise = fac (n-1) * n
5.7. Stern Brocot Floge
\(\\s_{0} = 0 \\ s_{1} = 1 \\ s_{2n} = s_{n} \\ s_{2n+1} = s_{n} + s_{n+1}\)
(*/*) :: Integer -> Integer -> Integer (*/*) = div (*%*) :: Integer -> Integer -> Integer (*%*) = rem sternBrocot :: Integer -> Integer sternBrocot n | n == 0 = 0 | n == 1 = 1 | n *%* 2 == 0 = sternBrocot half | otherwise = sternBrocot half + sternBrocot (half + 1) where half = n */* 2 suche :: Integer -> Integer -> Integer suche suchziel postionziel | sternBrocot postionziel > suchziel = postionziel | otherwise = suche suchziel (postionziel +1)