programing

Haskell의 ($)는 마술 연산자입니까?

goodcopy 2021. 1. 15. 19:16
반응형

Haskell의 ($)는 마술 연산자입니까?


다음과 같은 기능이 있다고 가정합니다.

infixr 0 <|

{-# INLINE (<|) #-}
(<|) :: (a -> b) -> a -> b
f <| x = f x

foo :: a -> (forall b. b -> b) -> a
foo x f = f x

다음은 유형 검사를하지 않습니다.

ghci> foo 3 <| id

Couldn't match expected type `forall b. b -> b'
            with actual type `a0 -> a0'
In the second argument of `(<|)', namely `id'
In the expression: f 3 <| id
In an equation for `it': it = f 3 <| id

그러나 foo 3 $ id 않습니다 .

(<|)의 정의는 (내가 아는 한) ($)의 정의와 동일합니다. 기본 라이브러리 소스에서 정의를 거의 뜯어 내고 ($)의 모든 인스턴스를 (<|)로 변경했습니다. 컴파일러 마법?


예, ($)명령형 유형을 처리 하는 데 약간의 컴파일러 마법이 있습니다. 모두가 기대하기 때문에 소개되었습니다

runST $ do
  foo
  bar
  baz

typecheck를 할 수 있지만 정상적으로는 할 수 없습니다. 자세한 내용은 여기 (검색 runST),이 이메일 및이 이메일을 참조 하십시오 . 그것의 부족은 실제로 유형 검사기 ($)에는 명령형 유형의 일반적인 경우를 해결할 수있는 기능을 제공 하는 특수 규칙이 있다는 것 입니다.

참조 URL : https://stackoverflow.com/questions/20795747/haskells-is-a-magic-operator

반응형