İstediğim böyle bir şey yazmaktırControl.Arrow: Neden "(a, b) = (ilk, saniye)" izin verir "başarısız? Ben bile yazamıyorum öğrendim</p> <p><code>let (a,b) = if *condition* then (first, second) else (second, first)</code></p> <p>:
let (a,b) = (first,second)
Bir hata ile başarısız:
<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
Simon Peyton-Jones (şimdi bulmakta zorluk yaşıyorum) posta listeleri birine büyük bir e-posta var gibi typechecking desen bağlamaları inceliklerini ele hangi bu. Gerçekten de, Haskell98 Raporunun konuyu tamamen gözden kaçırdığı ve komitenin Haskell 2010 Raporu'nu yazmadan önce desen bağlamaları için nasıl bir yazım denetimi yapılması gerektiği konusunda biraz zaman harcadığı çok ince. Ben bir cevap yazabilirim, ancak SPJ'nin önündeki e-postaları almadan inceliklerini almak için kendime güvenmeme gerek yok ... –
Bir tahminde, sorun şu ki, bağın sağ tarafı, çıkarsama türünü alır. a1 a2. (Ok a1, Ok a2) => (a1 ..., a2 ...) 'yerine (forall a1. Ok a1 => ..., forall a2. Ok a2 => ...)', bu yüzden forall, tuple * in * dışına taşınır ve çiftdeki değerlerin her ikisi de tamamen polimorfik değildir. –