"학습 총화 - Haskell - 5" Haskell 중요 개념 - 함수
Table of Contents
1 하 스 켈 기본 지식
2 Haskell 중요 데이터 구조 - list
3 Haskell 상용 데이터 구조
4 Haskell 타 입
5 Haskell 중요 개념 - 함수
Haskell 의 프로 그래 밍 방식 은 함수 식 프로 그래 밍 이 라 고 불리 기 때문에 함수 의 개념 은 Haskell 에서 매우 중요 한 위 치 를 차지한다.
5.1 함수 정의
doubleMe x = x + x
ghci>doubleMe 3
6
ghci>1 + (doubleMe 3)
7
ghci>doubleMe 3.4
6.8
doubleMeFloat :: Float -> Float
doubleMeFloat x = x + x
ghci>doubleMeFloat 2.4
4.8
ghci>doubleMeFloat 2
4.0
Float - > Float 의 의 미 는 Float 형식 (첫 번 째 Float) 의 인 자 를 받 아들 여 Float 형식 (두 번 째 Float) 의 결 과 를 되 돌려 주 는 것 입 니 다.
doubleList :: (Num a) => [a] -> [a]
doubleList [] = []
doubleList (x:xs) = (x+x):(doubleList xs)
ghci>doubleList [1,2,3]
[2,4,6]
ghci>doubleList [1.1,2.2,3.3]
[2.2,4.4,6.6]
위의 코드 는 함수 형식 을 정의 할 때 유형 매개 변수 a 를 사용 하여 함 수 를 여러 가지 유형 에 적용 할 수 있 습 니 다. 또한 함수 정의 에 (x + x) 가 있 기 때문에 덧셈 을 사 용 했 기 때문에 a 유형 은 반드시 Num 의 인 스 턴 스 여야 합 니 다.
5.2 고급 함수 (High - order functions)
5.2.1 Curried functions
엄격 한 의미 에서 볼 때 Haskell 의 모든 함 수 는 하나의 매개 변수 만 있 습 니 다. 이것 은 다른 사람 이 현혹 시 키 는 곳 입 니 다. 왜냐하면 이전에 우 리 는 이미 많은 함 수 를 사 용 했 기 때문에 하나의 매개 변수 만 있 는 것 이 아 닙 니 다.예 를 들 면
ghci>:t max
max :: Ord a => a -> a -> a
ghci>max 3 4
4
우 리 는 몇 가지 현상 을 관찰 하기 위해 다시 실험 을 한다.우선 우리 자신의 max 함 수 를 정의 합 니 다.
maxInteger :: Integer -> Integer -> Integer
maxInteger x y
| x >= y = x
| otherwise = y
ghci>:t maxInteger
maxInteger :: Integer -> Integer -> Integer
ghci>maxInteger 3 4
4
그런 후에 우 리 는 아래 의 방식 을 통 해 다른 함 수 를 얻 을 수 있다.
ghci>let maxInteger' = (maxInteger 3)
ghci>:t maxInteger'
maxInteger' :: Integer -> Integer
ghci>maxInteger' 4
4
ghci>maxInteger' 5
5
ghci>maxInteger' 3
3
ghci>maxInteger' 2
3
ghci>maxInteger' 1
3
우 리 는 max Integer 에 게 하나의 인자 3 만 주 고 결 과 를 되 돌려 준 후에 함수 max Integer 를 얻 었 다.이 함 수 는 매개 변 수 를 받 습 니 다. 함수 의 기능 은 이 매개 변 수 를 3 과 비교 한 다음 에 그 중의 비교적 큰 수 를 출력 하 는 것 입 니 다.이것 은 바로 max Integer 가 정 수 를 받 아 함수 하 나 를 되 돌려 주 었 다 는 것 이다.max Integer 의 유형 을 살 펴 보 겠 습 니 다.
maxInteger :: Integer -> Integer -> Integer
max Integer 는 두 개의 정 수 를 받 는 것 으로 해석 할 수 있 을 뿐만 아니 라 하나의 정 수 를 되 돌려 줍 니 다.또한 하나의 정 수 를 받 아 함 수 를 되 돌려 주 는 것 으로 해석 할 수 있 습 니 다. 이 되 돌아 오 는 함수 유형 은 Integer - > Integer, 즉 max Integer '의 유형 입 니 다.실험 적 으로 볼 때 두 번 째 해석 은 더욱 정확 하 다.이것 은 우리 가 처음에 제기 한 Haskell 의 함수 가 모두 하나의 매개 변수 만 있다 는 것 을 설명 한다.람 다 연산 을 배 웠 다 면 낯 설 지 않 았 을 것 이다.이 점 에 근거 하여 우 리 는 이렇게 함 수 를 정의 할 수 있다.
max3 = max 3
ghci>max3 1
3
ghci>max3 2
3
ghci>max3 3
3
ghci>max3 4
4
ghci>max3 5
5
이 함 수 는 정 의 를 내 릴 때 인자 도 명시 적 으로 제시 하지 않 았 지만 사용 할 때 는 인 자 를 받 을 수 있 습 니 다.
5.2.2 익명 함수
때때로 우 리 는 함수 가 필요 하지만, 이 함 수 는 단지 임시로 사용 할 뿐, 우 리 는 심지어 그것 의 이름 을 지어 줄 필요 가 없다.예 를 들 어 다음 함수:
ghci>:t map
map :: (a -> b) -> [a] -> [b]
map 는 하나의 함수, 하나의 List 를 받 고 다른 List 를 되 돌려 줍 니 다.여기 서 받 은 함수 가 임시 적 으로 만 사용 된다 면 우 리 는 이렇게 할 수 있 습 니 다.
ghci>map (\x -> x + 1) [1,2,3]
[2,3,4]
여기 (\ x - > x + 1) 는 익명 함수 입 니 다.또 익명 함수 에 두 개의 인자 가 있다 면 이렇게 할 수 있다.
ghci>(\x y -> x + y) 1 2
3
이런 익명 함수 의 정의 방식 은 사실 lambda 연산 에서 함수 의 정의 방식 이다.
5.2.3 함 수 를 매개 변수 로 하 는 함수
map :: (a -> b) -> [a] -> [b]
map _ [] = []
map f (x:xs) = f x : map f xs
를 되 돌려 줍 니 다.ghci>map (+3) [1,2,3]
[4,5,6]
ghci>map (\x -> x+3) [1,2,3]
[4,5,6]
filter :: (a -> Bool) -> [a] -> [a]
filter _ [] = []
filter p (x:xs)
| p x = x : filter p xs
| otherwise = filter p xs
ghci>filter (>=3) [5,2,1,4,3,7]
[5,4,3,7]
foldl :: (a -> b -> a) -> a -> [b] -> a
먼저 테스트 해 보 니 직관 적 인 인상 을 가지 고 있다.ghci>foldl (\acc x -> acc + x) 0 [1,2,3]
6
ghci>foldl (\acc x -> acc + x) 0 [1,2,3,4]
10
ghci>foldl (\acc x -> acc + x) 0 [5,8,4]
17
foldl 은 함수 하나, 값 하나, List 하 나 를 받 아 값 을 되 돌려 줍 니 다.그 작업 과정 은 이 렇 습 니 다. 먼저 두 번 째 매개 변 수 는 acc 의 초기 값 입 니 다. 매번 세 번 째 매개 변수 에서 하나의 요 소 를 추출 합 니 다. acc 의 값 과 이 요 소 는 첫 번 째 매개 변수 (하나의 함수) 의 매개 변수 로 첫 번 째 매개 변수 (하나의 함수) 가 돌아 온 결 과 는 acc 의 새로운 값 으로 뒤의 연산 에 참여 합 니 다.세 번 째 인자 가 [] 일 때 까지.세 번 째 예 를 들 어 acc 의 초기 값 은 0 이 고 (\ acc x - > acc + x) 0 5 는 결과 5 를 얻어 acc 의 새로운 값 으로 한다.acc 새 값 은 5 (\ acc x - > acc + x) 58 로 결과 13 을 얻 었 습 니 다. acc 의 새 값 입 니 다.acc 새 값 은 13 (\ acc x - > acc + x) 134 로 결 과 를 얻 었 습 니 다. acc 의 새 값 인 acc 새 값 은 17 List 입 니 다. [5, 8, 4] 모든 요 소 를 사 용 했 고 프로그램 이 끝 났 으 며 결 과 는 acc 의 최종 값 17 입 니 다.5.2.4 함수 조합
수학 에서 사실은 함수 의 조합 을 배 웠 습 니 다. 예 를 들 어 f = x + 1 g = x * 3 령 h = f o g 는 이때 h 가 새로운 함수 입 니 다. h 에 게 매개 변수 2 를 전달 하면 먼저 매개 변 수 는 g, 2 * 3 에 6 을 얻 은 다음 에 6 은 f 의 매개 변수 로 6 + 1 = 7 입 니 다.하 스 켈 리 도 이런 조합 방식 을 제공 했다.
(.) :: (b -> c) -> (a -> b) -> a -> c
f . g = \x -> f (g x)
f' :: Integer -> Integer
f' x = x + 1
g' :: Integer -> Integer
g' x = x * 3
ghci>g' 2
6
ghci>f' 6
7
ghci>let h = f' . g'
ghci>h 2
7
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.