2009-04-12 9 views
15

Aynı infix operatörünü (<*>) kullanmak isteyen iki farklı Haskell modülü arasında bir ad çakışması var. Haskell 98 raporunda,Haskell'de sembolün nitelikli ismini nasıl yazarım?

izin verildiğini, ancak çalışmasını alamıyorum. kendi bütünlükleri içinde buraya Test.hs şunlardır:

module Test 
where 

import qualified Test2 as T 

three = T.<*> 

ve Test2.hs:

module Test2 
where 
(<*>) = 3 

Ama bir hata mesajıyla sonuçlanır derlemek çalışıyorum: Ben T.(<*>) çalıştı

Test.hs:6:12: parse error on input `T.<*>' 

ama bu işe yaramazsa ya.

import qualified tarafından içe aktarılan bir modülde tanımlanan sembolik bir isme nasıl başvurabilirim?

cevap

15

Bir tamsayı olarak bir infix operatörü tanımlamak garip

three = (T.<*>) 

deneyin. en \\ düşünelim (set fark operatörü):

import qualified Data.List as L 

foo = [1..5] L.\\ [1..3] -- evaluates to [4,5] 
diff = (L.\\) 

Yukarıda görebileceğiniz gibi, L.\\ nitelikli infix operatörüdür; ve hala bir infix operatörü olarak çalışıyor. Bunu bir değer olarak kullanmak için her şeyi parantez içine alırsınız.

+0

ama mümkün olduğunca örnek olarak basit yapmaya çalışıyordu:

import T ((<*>)) 

böylece nitelikli ithal aynıdır. –

5

Sargılı sargılı sembolleri içe aktardığımızı unutmayın. Örneğin. Gerçekten Garip

import qualified T as Q 

main = print (Q.<*>) 
+0

Bu garip bir açıklama ... ilk satır diğerleriyle gerçekten alakalı değil. Elbette ilk satır "Tam uygulanmamış operatörlerin parantez içinde olması gerektiğini unutmayın." Ve sonra 'f = (<*>)' ye 'f = (M. <*>)' yazınız. – porges

İlgili konular