"학습 총화 - Haskell - 5" Haskell 중요 개념 - 함수

12485 단어
Haskell 중요 개념 - 함수
Table of Contents
  • 1 Haskell 기본 지식
  • 2 Haskell 중요 데이터 구조 - list
  • 3 Haskell 상용 데이터 구조
  • 4 Haskell 유형
  • 5 Haskell 중요 개념 - 함수
  • 5.1 함수 정의
  • 5.2 고급 함수 (High - order functions)
  • 5.2.1 Curried functions
  • 5.2.2 익명 함수
  • 5.2.3 함 수 를 매개 변수 로 하 는 함수
  • 5.2.4 함수 조합


  • 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) 의 결 과 를 되 돌려 주 는 것 입 니 다.
  • 패턴 일치 (Pattern Matching) 와 재 귀적 (Recrusion) 방식 정의
  • 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
  • 정의
  • 함 수 를 List 의 모든 요소 에 작용 하여 매번 얻 은 결 과 를 다른 List 에 놓 고 마지막 으로 이 "결과 List"
    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
  • 정의
  • 조건 함수, 하나의 List 를 받 아 List 의 모든 조건 을 만족 시 키 는 요 소 를 추출 합 니 다.
    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 은 하나의 List 에 있 는 요 소 를 모두 더 하려 면 어떻게 하 시 겠 습 니까?패턴 으로 재 귀 와 일치 합 니까?foldl 은 해결 방안 을 제공 했다.
    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
    

    좋은 웹페이지 즐겨찾기