2013-04-24 19 views
6

Derece açılarla çalışırken, postfix operatörü olarak kullanılacak derece sembolünü (°) tanımlamak istiyorum.Haskell'de bir postfix operatörünü nasıl tanımlarım?

let o = pi/180 

ve bu gibi kullanmak: Şu anda, (GHCi olarak) bu hattı kullanmak

tan(11*o) 

ama sadece gitmek istiyorum: daha net

tan 11° 

olan. Dereceli operatör, ‘tan’ ve diğer işlevlerden daha yüksek önceliğe sahip olmalıdır.

bende en yakın olan:

let (°) x _ = x*pi/180 

böyle kullandı:

tan(11°0) 

ancak varsayılan öncelik parens hala ihtiyaç vardır demektir ve kukla numarası ile bu alternatiftir Şu anda kullandığımdan daha kötü.

+8

"Dereceli operatör," tan "ve diğer işlevlerden daha yüksek önceliğe sahip olmalıdır." <- Bu işe yaramayacak, işlev uygulaması dil özelliklerine göre en yüksek önceliğe sahip. –

+0

Niçin dereceleri temsil eden yeni bir türle yeni bir sayısal tür (çift veya her ne olursa olsun) tanımlamıyorsunuz? Elbette eşitliği tanımlamak istiyorsanız, derecelerin "modüler" doğasına dikkat etmeniz gerekir. –

+0

Haskell, yazarken kullandığınız yolu derlemenizi sağlayacak bir dil değildir. o. Perl ve hatta Python'un aksine, Haskell'in infix sözdizimi aslında çok kırpılmış ve basittir, sadece bu kadar basit bir şekilde tasarlanmalıdır ki bu basit temel bile birçok parensi dışarıda bırakmak için çok verimli kestirmelere izin verir. şeyleri oldukça okunabilir hale getirmek. Fakat bu son nokta kısmen de olsa, bu oldukça katı ayrıştırma kuralları vardır. – leftaroundabout

cevap

3

Infix operatörlerinin önceliğini değiştirmenizi sağlayan fixity declarations'a bakın. Önceliği çok yükseğe ayarlamamaya dikkat edin veya diğer operatörler beklendiği gibi davranmayacaktır. Örneğin

:

infixl 7 ° 
(°) x _ = x*pi/180 

Düzenleme: ah @Daniel Fischer sağ - fonksiyon uygulaması en yüksek önceliğe

11

Yapamazsın çünkü bu mevcut ihtiyaçları için çalışmaz, Rapor tarafından tanımlanan en azından Haskell'de. Bununla birlikte, a GHC extension that allows postfix operators var.

Ne yazık ki bu size istediğiniz her şeyi vermez; Özellikle, tek olumsuzlama operatörü sık sık yaptığı gibi, hala parantez gerektirir.

İlgili konular