✏️ 1.3 ~ 1.8 강의 필기

정나영·2022년 10월 5일
0

🔑 1.3 Features

1. Higher-order functions (고차원 함수)

:함수가 인자로 다른 함수를 받는 함수

📌 map 함수

ghci> map length ["abc","abcdef"]	
[3,6]

map f [a,b,c]
= [f(a),f(b),f(c)]

2. Anonymous functions(aka lambdas) (이름 없는 함수) (\)

: 함수를 한번만 사용할 때 함수 정의 없이 쓰는 이름 없는 함수

 \ 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"] 

3. Partial application (부분 적용)

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

4. Algebraic datatypes

:사용자가 원하는 데이터 유형을 만드는 것

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

5. Pattern matching

: 함수를 간결하게 정의하는 방법

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| :}

6. Lists

📌 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"]

7. Parameterized types

: 다른 타입을 매개변수로 받아서 완전하게 되는 타입

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]

8. Type classes

ghci> data Character = Pororo | Pokemon | Unknown deriving Show 
ghci> Pororo
Pororo

Show: type class
deriving Show: Show라는 type class 안에 Character 타입이 포함된다는 의미

🔑 1.6 Expressions and Types

An expression has a value and a type(::).

Expression      Type	   Value
True			Bool	   True
not True		Bool	   False
"as" ++ "df"	[Char]     "asdf"
                =String

1.6.1 Syntax of Expressions

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.6.2 Syntax of Types

  • 타입 : 대문자로 시작
  • 타입변수 : 소문자로 시작

1.6.3 Note About Misleading Types

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]

[출처] https://haskell.mooc.fi/part1#expressions-and-types

0개의 댓글