Haskell ID 기능에 사용
Haskell에서 id 함수 의 용도는 무엇입니까?
특정 값을 변경하지 않고 유지하려는 고차 함수 (함수를 인수로 사용하는 함수)에 대한 인수로 유용합니다 .
예 1 : Just에 있으면 값을 그대로두고 그렇지 않으면 기본값 7을 반환합니다.
Prelude Data.Maybe> :t maybe
maybe :: b -> (a -> b) -> Maybe a -> b
Prelude Data.Maybe> maybe 7 id (Just 2)
2
예제 2 : 접기를 통해 함수 구축 :
Prelude Data.Maybe> :t foldr (.) id [(+2), (*7)]
:: (Num a) => a -> a
Prelude Data.Maybe> let f = foldr (.) id [(+2), (*7)]
Prelude Data.Maybe> f 7
51
기본 케이스로를 사용하여 f
와 함께 함수 목록을 접어서 새로운 함수 를 빌드했습니다 .(.)
id
예제 3 : 모노 이드 (단순화) 기능의 기본 케이스.
instance Monoid (a -> a) where
mempty = id
f `mappend` g = (f . g)
접기가있는 예제와 마찬가지로 함수는 id
빈 케이스에 대해 제공 (.)
하고 추가 로 연결 가능한 값으로 처리 할 수 있습니다 .
예제 4 : 간단한 해시 함수.
Data.HashTable> h <- new (==) id :: IO (HashTable Data.Int.Int32 Int)
Data.HashTable> insert h 7 2
Data.HashTable> Data.HashTable.lookup h 7
Just 2
해시 테이블에는 해싱 함수가 필요합니다. 하지만 키가 이미 해시 된 경우에는 어떻게됩니까? 그런 다음 id 함수를 전달하여 성능 오버 헤드없이 해싱 방법으로 채 웁니다.
특히 덧셈과 곱셈을 사용하여 숫자를 조작하면 0과 1의 유용성을 알 수 있습니다. 마찬가지로 목록을 조작하면 빈 목록이 매우 편리합니다. 마찬가지로 함수를 조작하면 (함수 프로그래밍에서 매우 일반적) id
.
함수형 언어에서 함수는 매개 변수로 전달할 수있는 1 급 값입니다. 따라서의 가장 일반적인 용도 중 하나는 id
함수를 매개 변수로 다른 함수에 전달하여 수행 할 작업을 지정할 때 나타납니다. 수행 할 작업의 선택 중 하나는 "그냥 내버려 두십시오"입니다.이 경우 id
매개 변수로 전달 합니다.
당신이 매 턴마다 움직이는 퍼즐에 대한 해결책을 찾고 있다고 가정 해보자. 당신은 후보자 위치로 시작 pos
합니다. 각 단계에는 할 수있는 변형 목록이 있습니다 pos
(예 : 퍼즐에서 조각을 슬라이드). 함수형 언어에서는 변형을 함수로 표현하는 것이 자연 스럽기 때문에 이제 함수 목록을 사용하여 동작 목록을 만들 수 있습니다. 이 퍼즐에서 "아무것도하지 않는 것"이 합법적 인 움직임이라면 id
. 그렇게하지 않았다면 "아무것도하지 않음"과는 다르게 작동하는 특수한 경우로 "아무것도하지 않음"을 처리해야합니다. 를 사용 id
하면 단일 목록에서 모든 케이스를 균일하게 처리 할 수 있습니다.
이것이 거의 모든 용도가 id
존재 하는 이유 일 것입니다 . "아무것도하지 않음"을 "무언가"와 동일하게 처리합니다.
다른 종류의 답변 :
컴포지션을 통해 여러 함수를 연결할 때 자주이 작업을 수행합니다.
foo = id
. bar
. baz
. etc
위에
foo = bar
. baz
. etc
편집하기 쉽게 유지합니다. 다음과 같은 다른 '제로'요소로 비슷한 일을 할 수 있습니다.
foo = return
>>= bar
>>= baz
foos = []
++ bars
++ bazs
또한 귀하의 골프 점수를 향상시킬 수 있습니다. 사용하는 대신
($)
아이디를 사용하여 단일 문자를 저장할 수 있습니다.
예 :
zipWith id [(+1), succ] [2,3,4]
흥미롭고 유용한 결과입니다.
우리는 id
. 여기에 회문이 있습니다 :)
import Control.Applicative
pal :: [a] -> [a]
pal = (++) <$> id <*> reverse
Imagine you are a computer, i.e. you can execute a sequence of steps. Then if I want you to stay in your current state, but I always have to give you an instruction (I cannot just mute and let the time pass), what instruction do I give you? Id is the function created for that, for returning the argument unchanged (in the case of the previous computer the argument would be its state) and for having a name for it. That necessity appears only when you have high order functions, when you operate with functions without considering what's inside them, that forces you to represent symbolically even the "do nothing" implementation. Analogously 0 seen as a quantity of something, is a symbol for the absence of quantity. Actually in Algebra both 0 and id are considered the neutral elements of the operations + and ∘ (function composition) respectively, or more formally:
for all x of type number:
- 0 + x = x
- x + 0 = x
for all f of type function:
- id ∘ f = f
- f ∘ id = f
Whenever you need to have a function somewhere, but want to do more than just hold its place (with 'undefined' as an example).
It's also useful, as (soon-to-be) Dr. Stewart mentioned above, for when you need to pass a function as an argument to another function:
join = (>>= id)
or as the result of a function:
let f = id in f 10
(presumably, you will edit the above function later to do something more "interesting"... ;)
As others have mentioned, id
is a wonderful place-holder for when you need a function somewhere.
참고URL : https://stackoverflow.com/questions/3136338/uses-for-haskell-id-function
'programing' 카테고리의 다른 글
문자열이 정수인지 확인하기위한 C # 테스트? (0) | 2020.12.06 |
---|---|
C #에서 디렉터리 이름 바꾸기 (0) | 2020.12.06 |
순수 JPA 설정에서 데이터베이스 연결 얻기 (0) | 2020.12.06 |
목록의 모든 항목이 없음인지 확인하는 방법은 무엇입니까? (0) | 2020.12.06 |
Java의 epoch (1970-01-01)에서 밀리 초를 어떻게 얻습니까? (0) | 2020.12.06 |