수색…


비고

초보자가 할 수있는 몇 가지 오해를 정리합시다.

다음과 같은 기능을 경험했을 수 있습니다.

max :: (Ord a) => a -> a -> a  
max m n  
  | m >= n = m  
  | otherwise = n  

초보자들은 전형적으로 max :: (Ord a) => a -> a -> aaa 두 인자 (값)을 취하고 a 형의 값을 반환하는 함수 a 봅니다. 그러나 실제로 일어나고있는 것은 maxaa 인수 하나를 취하여 a -> aa -> a 함수반환한다는 것 입니다. 그런 다음이 함수는 a 유형의 인수를 취해 유형 a 의 최종 값을 리턴 a .

사실 maxmax :: (Ord a) => a -> (a -> a) 와 같이 쓰여질 수있다.

max 의 형식 시그니처를 고려하십시오.

Prelude> :t max  
max :: Ord a => a -> a -> a  

Prelude> :t (max 75)  
(max 75) :: (Num a, Ord a) => a -> a  

Prelude> :t (max "Fury Road")  
(max "Fury Road") :: [Char] -> [Char]  

Prelude> :t (max "Fury Road" "Furiosa")  
(max "Fury Road" "Furiosa") :: [Char]  

max 75max "Fury Road" 는 기능처럼 보이지 않을 수도 있지만 실제로는 마찬가지입니다.

혼란은 수학 및 기타 많은 공통 프로그래밍 언어에서 우리는 여러 가지 인수를 취하는 함수를 가질 수 있다는 사실에 기인합니다. 그러나 Haskell에서 함수는 인수 하나만 사용할 수 있으며 a 와 같은 값이나 a -> a 와 같은 함수를 반환 할 수 있습니다.

부분 적용 기능 추가

우리는 부분적인 애플리케이션 을 사용하여 첫 번째 인수를 "잠급니다". 하나의 인수를 적용한 후에는 결과를 반환하기 전에 하나 이상의 인수가 필요한 함수가 남아 있습니다.

(+) :: Int -> Int -> Int

addOne :: Int -> Int
addOne = (+) 1

그런 다음 addOne 을 사용하여 Int 에 하나를 추가 할 수 있습니다.

> addOne 5
6
> map addOne [1,2,3]
[2,3,4]

부분적으로 적용된 함수 반환

부분적으로 적용된 함수를 반환하면 간결한 코드를 작성할 수 있습니다.

add :: Int -> Int -> Int
add x = (+x)

add 5 2

이 예 (+ x)는 부분적으로 적용되는 함수입니다. add 함수의 두 번째 매개 변수는 함수 정의에 지정하지 않아도됩니다.

add 5 2 를 호출 한 결과는 7입니다.

섹션

Sectioning은 삽입 연산자에 부분적으로 인수를 적용하는 간결한 방법입니다.

예를 들어, 단어 끝에 "ing"을 추가하는 함수를 작성하고자한다면 섹션을 사용하여 간결하게 함수를 정의 할 수 있습니다.

> (++ "ing") "laugh"
"laughing"

두 번째 인수를 부분적으로 어떻게 적용했는지 주목하십시오. 일반적으로 지정된 순서로 인수를 부분적으로 만 적용 할 수 있습니다.

왼쪽 섹션을 사용하여 첫 번째 인수를 부분적으로 적용 할 수도 있습니다.

> ("re" ++) "do"
"redo"

보통 접두사 부분 애플리케이션을 사용하여 이와 동등하게 작성할 수 있습니다.

> ((++) "re") "do"
"redo"

뺄셈에 대한 참고 사항

초보자는 종종 부정적인 부분을 잘못 입력합니다.

> map (-1) [1,2,3]
***error: Could not deduce...

이 작동하지 않는 -1 리터럴로 파싱 -1 오히려 절단 된 오퍼레이터보다 - 인가 1 . subtract 함수는이 문제를 우회하기 위해 존재합니다.

> map (subtract 1) [1,2,3]
[0,1,2]


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow