에서 "진정한"일반적인 기능은 I가 복합 데이터 유형을 가정하자. 예를 들어 -하스켈
f :: M o -> M o
f (M (s,o)) = M (s++"!", o)
그러나, f
내가 그것을 인 원하는만큼 정말 같은 일반적인 없습니다. 특히 표현식에 f
을 사용하면 o
유형이 수정되므로 다른 유형의 o
으로 f
을 다시 사용할 수 없습니다. 예를 들어, 다음의 유형 체킹하지 않습니다 - 내가 인수로 f를 제공하는 대신 단순히 컴파일 후 F의 글로벌 정의를 사용하지 않는 경우, 놀랍게도 Couldn't match expected type 'Bool' with actual type '()'
-
p f = undefined where
m1 = M ("1",())
m2 = M ("2", True)
m1' = f m1
m2' = f m2
그것은 오류를 생성 잘 작동합니다! 즉 이것은 컴파일됩니다. -
p = undefined where
m1 = M ("1",())
m2 = M ("2", True)
m1' = f m1
m2' = f m2
특별한 이유가 있습니까? 어떻게하면이 문제를 해결할 수 있습니까? 즉 이 같은 표현식 내에서 변할 때도 모두 (M o)
에 적용 할 수있는 함수 f
을 정의 할 수 있습니까? 나는 실존 유형이 여기에 작용할 것으로 추측하고 있습니다. 그러나 나는 단지 그 방법을 이해할 수 없습니다.
왜 M을 튜플로 만들겠습니까? 얼마나 못생긴가. – alternative
기본적으로 "forall"은 무언가입니다. 이 텍스트를 볼 수 있습니다 : http://en.wikibooks.org/wiki/Haskell/Existentially_quantified_types – Nybble
@monadic, 실제로는 실제 코드에서 직면했던 문제를 재현하는 최소한의 예입니다 (상당히 복잡합니다). –