반응형
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
반응형
'programing' 카테고리의 다른 글
이 C ++ 11 정규식 오류 나 또는 컴파일러입니까? (0) | 2021.01.15 |
---|---|
stderr 및 디버그에 오류 로깅, log4j를 사용하여 stdout에 정보 로깅 (0) | 2021.01.15 |
나는“이혼”을 겪고 있습니까? (0) | 2021.01.15 |
Setup () 대 SetupGet () (0) | 2021.01.15 |
Python에서 구성 파일을 어디에 넣을까요? (0) | 2021.01.15 |