programing

Haskell ID 기능에 사용

nasanasas 2020. 12. 6. 21:38
반응형

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

반응형