2011-03-22 22 views
21

Bir mona içinde saklanan değere, bir adaya isim vermek zorunda kalmadan, bir dava gerçekleştirmenin bir yolu var mı? case ifadesi kısmen bu yüzden uygulanabilir Alternatifmonadik değerde kasa

mcase getChar of 
    ... 

çok güzel olurdu,: yerine bunu yapmanın

yani:

c <- getChar 
case c of 
    ... 

bunu yapmanın bir yolu var mı

:
case of 
    ... 

için şekeri alınmış olacaktır

\a -> case a of 
    ... 

Yani yapabilirsiniz:

getChar >>= case of 
       ... 
+0

Bunu zaten biliyor olabilirsiniz, ancak bu tam özellik hakkında haskell-cafe'de bir tartışma vardı (http://thread.gmane.org/gmane.comp.lang.haskell.cafe/81366/) . GHC tarafı [bununla bir problemi yok gibi görünüyor] (http://article.gmane.org/gmane.comp.lang.haskell.cafe/81533), belki de bunu er ya da geç uygulamaya koyacağız. –

cevap

5

cevap hayır. Haskell 98'de, içinde bir isim kullanmadan bir durum ifadesi kullanamazsınız. Ancak, kasa-lambdalar için destek eklemek için proposal var. Önerdikleri sözdizimi de teklif ettiğinizle aynı.

6

Hayır, pek değil, ancak başka bir fonksiyonun içine davayı taşımak ve Birli eylemin sonucu uygulayabilirsiniz.

f x = case x of ... 

main = do 
    f <$> getChar 

Alternativly aşağıdaki mümkündür:

getChar >>= \x -> case x of ... 
+0

Evet, ama sonra ** değeri ** x' adı atanmış. Monadik olmayan kodları monadik kodlara dönüştürdüğümde ve vaka bildirimlerinde ameliyat yapmak zorunda kaldığımda buna katlanıyorum. – pat

+0

O zaman ilk yaklaşımımı kullan. – jmg

+4

Bence ilk vaka en iyisidir. Ardından, case ifadesini hep birlikte bırakabilir ve fonksiyon tanımında desen eşleştirmesini yapabilirsiniz. – HaskellElephant

13

FUZxxl tarafından belirtilen teklif, 7.6.1'den beri GHC'de uygulandı, buna LambdaCase deniyor.

Şimdi yapabilirsiniz:

{-# LANGUAGE LambdaCase #-} 
getChar >>= \case 
    ... 

Not case anahtar kelime ve bu durumda hiçbir of olmadığı gerçeğini önce \.

+0

Ayrıca "if": D – remdezx

+1

@remdezx için de benzer bir şey olmalı, eğer gerçekten "if" için benzer bir şeye ihtiyacınız yok. Sadece "DataBoolean" dan 'bool 'kullanın. – dfeuer

İlgili konular