2009-04-12 16 views
9

Sadece SML ile başlıyorum ve bazı kodları değiştirmeye çalışıyorum, bu yüzden ne yaptığını anlıyorum (iyi bir SML/NJ hata ayıklayıcısı bulamıyorum, ama bu ayrı bir soru). Ben davaya ' 'tamsayı' dönen' demek için bir baskı beyanı nasıl eklerim SML'de bir vaka bildiriminin içine nasıl yazdırırsınız?

fun type_check e theta env non_gens = 
    case e of 
    constant_int _ => (integer,theta) 
    | 
    constant_bool _ => (boolean,theta) 
    | ... 

vb, bu durum constant_int geçerli kod, bir veri türü kısmı zaten ilan olduğunu varsayalım? Denedim:

... 
constant_int _ => (print "returning integer") (integer,theta) 
... 

Ama olsun:

 
    stdIn:167.22-167.65 Error: operator is not a function [tycon mismatch] 
     operator: unit 
     in expression: 
     (print "returning integer") (integer,theta) 

Ben sadece dönüş değeri olarak ele alınmalıdır sadece son hangi tabloların bir dizi, yürütmek için nasıl anlayamıyorum düşünüyorum. Herhangi bir tavsiye?

Ayrıca, kendi veri türü değemi nasıl yazdırırım? SML baskıya() bir veri türü değerini iletmeye çalıştığımda hoşuma gitmedi, bu yüzden muhtemelen her veri türü için yeni bir yazdırma işlevi oluşturmalıyım, doğru mu?

cevap

20

"Noktalı virgül kullanarak, yalnızca son değer dönüş değeri olarak kabul edilen bir dizi ifade gerçekleştirebilirsiniz". Bu durumda

... 
constant_int _ => (print "returning integer"; (integer,theta)) 
... 

, biz noktalı virgül harf ifadesi daha düşük önceliğe sahip olduğundan, parantez içindeki ifadeleri dizisini sarmak için gerekli ve biz parantez yoktu, bu durumda onu düşünürdüm vaka-ifade, noktalı virgülle sona erdi ve tüm vaka ifadesi, bu durumda istediğiniz şey değil, dizinin bir parçası olduğunu.

+0

Daha yüksek önceliği kastediyor musunuz? – Shuzheng

+2

@nlykkei: Hayır, daha düşük önceliği kastediyorum. Olgu ekspresyonu ilk önce gruplanmıştır, çünkü daha yüksek önceliğe sahiptir, daha önceliği olan, en dıştaki yapı olan noktalı virgülü bırakır. – newacct

İlgili konular