:함수가 인자로 다른 함수를 받는 함수
📌 map 함수
ghci> map length ["abc","abcdef"]
[3,6]
map f [a,b,c]
= [f(a),f(b),f(c)]
: 함수를 한번만 사용할 때 함수 정의 없이 쓰는 이름 없는 함수
\ x -> length x > 1
(인자) (함수 몸체)
ghci> (\x -> length x > 1) "abc"
True
ghci> (\x -> length x > 1) "c"
False
💡참고 (하스켈에서 함수 만드는 법)
longerThanOne x = length x > 1
🟰
longerThanOne(String x) {return (length x > 1); }
ghci> longerThanOne x = length x > 1
ghci> longerThanOne "abc"
True
ghci> longerThanOne "a"
False
📌 filter 함수
형태: filter testFun list
:list 에 있는 원소를 하나씩 꺼내어 testFun 호출
📎고차원 함수이기도 하다. -> 인자로 함수를 받았기 때문
ghci> filter (\x -> length x > 1) ["abc","d","ef"]
["abc","ef"]
partial : (*2)에서 함수의 인자가 2개 필요한데, 1개만 주고 호출
application : 함수 호출
ghci> map (*3) [1,2,3]
[3,6,9]
ghci> map (/3) [1,2,3]
[0.3333333333333333,0.6666666666666666,1.0]
f x y z = x+y+z
🟰
f(int x, int y, int z) {return x+y+z; }
ghci> f x y z = x+y+z
ghci> f 1 2 3
6
ghci> :type f 1 2
f 1 2 :: Num a => a -> a
ghci> g = f 1 2
ghci> g 3
6
ghci> g 4
7
ghci> g 5
8
:사용자가 원하는 데이터 유형을 만드는 것
data Character = Pororo | Pokemon | Unknown
(키워드) (타입)
//deriving Show: print를 하기 위함
ghci> data Character = Pororo | Pokemon | Unknown deriving Show
ghci> Unknown
Unknown
ghci> Pororo
Pororo
ghci> data Shape = Point | Rectangle Double Double | Circle Double deriving Show
ghci> Point
Point
ghci> Rectangle 10 20
Rectangle 10.0 20.0
: 함수를 간결하게 정의하는 방법
ghci> :{
ghci| menu 1 = Pororo
ghci| menu 2 = Pokemon
ghci| menu _ = Unknown
ghci| :}
ghci> menu 1
Pororo
ghci> menu 7
Unknown
ghci> :type menu
menu :: (Eq a, Num a) => a -> Character
ghci> area Point = 0
ghci> area (Rectangle width height) = width * height
ghci> area (Circle radius) = 2 * pi * radius
ghci> area (Circle 5)
31.41592653589793
ghci> area (Rectangle 3 5)
15.0
💡참고 (여러 라인을 입력할 경우)
ghci> :{
ghci| menu 1 = Pororo
ghci| menu 2 = Pokemon
ghci| menu _ = Unknown
ghci| :}
📌 List comprehension (리스트 제시법)
형태: [ x | x <- [1..], even x ]
ex 1) 짝수 중 맨 앞 10개만 꺼내기
ghci> take 10 [x|x<-[1..], even x]
[2,4,6,8,10,12,14,16,18,20]
ex 2) 짝수 중 맨 앞 10개 제외하고(drop) 그 다음 10개 꺼내기
ghci> take 10 (drop 10 [x|x<-[1..], even x])
[22,24,26,28,30,32,34,36,38,40]
ghci> [whole | first <- ["Eva","Mike"],
last <- ["Smith", "Wood", "Odd"],
let whole = first ++ last,
even(length whole)]
["EvaSmith","EvaOdd","MikeWood"]
: 다른 타입을 매개변수로 받아서 완전하게 되는 타입
ghci> :type [1,2,3] :: [Int]
[1,2,3] :: [Int] :: [Int]
ghci> :type ["abc", "def"]
["abc", "def"] :: [String]
ghci> :type reverse
reverse :: [a] -> [a] (a: 타입 변수)
ghci> reverse [1,2,3]
[3,2,1]
ghci> data Character = Pororo | Pokemon | Unknown deriving Show
ghci> Pororo
Pororo
Show: type class
deriving Show: Show라는 type class 안에 Character 타입이 포함된다는 의미
An expression has a value and a type(::).
Expression Type Value
True Bool True
not True Bool False
"as" ++ "df" [Char] "asdf"
=String
Haskell Python, Java, ..
f 1 f(1)
f 1 2 f(1,2)
Haskell Python, Java, ..
g h f 1 g(h,f,1)
g h (f 1) g(h,f(1))
g (h f 1) g(h(f,1))
g (h (f 1)) g(h(f(1)))
Haskell Python, Java, ..
a+b a+b
f a + g b f(a) + g(b)
f (a + g b) f(a+g(b))
1) Num : type class
-type을 알려주지 않았으므로 Int, Integer 등 타입변수가 속한 Num이라는 type class에 속한 a 출력
ghci> :type 1+1
1+1 :: Num a => a
ghci> :type 1+1 :: Int
1+1 :: Int :: Int
ghci> :type 1+1 :: Integer
1+1 :: Integer :: Integer
2) [Char] = String
ghci> :t "asdf"
"asdf" :: String
ghci> :t "asdf" :: [Char]
"asdf" :: [Char] :: [Char]