는 내가 원하는 것은 이런 식으로 뭔가를 작성하는 것입니다Control.Arrow : "let (a, b) = (first, second)"가 실패하는 이유는 무엇입니까? 나는 심지어이 쓸 수 있다는 것을 발견</p> <p><code>let (a,b) = if *condition* then (first, second) else (second, first)</code></p> <p>:
let (a,b) = (first,second)
이 오류와 함께 실패합니다
<interactive>:7:5:
Could not deduce (Arrow a0)
from the context (Arrow a)
bound by the inferred type for `a':
Arrow a => a b c -> a (b, d) (c, d)
at <interactive>:7:5-26
The type variable `a0' is ambiguous
When checking that `a' has the inferred type
a :: forall (a :: * -> * -> *) b c d.
Arrow a =>
a b c -> a (b, d) (c, d)
Probable cause: the inferred type is ambiguous
<interactive>:7:5:
Could not deduce (Arrow a0)
from the context (Arrow a)
bound by the inferred type for `b':
Arrow a => a b c -> a (d, b) (d, c)
at <interactive>:7:5-26
The type variable `a0' is ambiguous
When checking that `b' has the inferred type
b :: forall (a :: * -> * -> *) b c d.
Arrow a =>
a b c -> a (d, b) (d, c)
Probable cause: the inferred type is ambiguous
사이먼 페이튼 존스 (지금은 찾기 힘든 데) 메일 링리스트 중 하나에 큰 이메일을이 같은 유형 검사 패턴 바인딩의 미묘한 차이에 대해 설명하는 이. 실제로 Haskell98 보고서가이 문제를 완전히 간과 한 것은 매우 미묘하며,위원회는 Haskell 2010 보고서를 작성하기 전에 패턴 바인딩을 위해 형식 검사가 어떻게 수행되어야하는지에 대해 심도있는 시간을 보냈습니다. 나는 내 앞에서 SPJ의 이메일없이 미묘함을 바로 잡을 자신을 신뢰하지 않는다는 것을 제외하고는 답을 쓸 것입니다. –
짐작할 때, 여기서의 문제는 바인딩의 우변이 유추 된 타입을 얻는다는 것입니다. a1 a2. (for a1, a1 => ..., a2 for a2, a2 => ...)'와는 반대로 (a1, a2) => (a1 ..., a2 ...) 그래서 forall은 tuple의 out * out으로 옮겨지고 그 쌍의 값 중 하나는 완전히 다형성이 아닙니다. –