2013-03-31 18 views
9

eşleşenDesen okul exercice olarak GHCi

Bu Fonksiyon

bar :: Float -> Float -> Float 
bar x 0 = 0 
bar 0 y = 0 
bar x y = x * y 

Ben

let bar x 0 = 0; bar 0 y = 0; bar x y = x * y 

olarak ghc kısmına yazıp

bar foo 0 
bar 0 foo 

Ben değerlendirmek zorunda '|' kullanımı için çubuğu değiştirmesi istendi bu yüzden böyle bir şey yapmak istiyorum:

let bar x y = | x 0 = 0 | 0 y = 0 | x y = x * y 

ama GHCi ben aldım

parse error on input '=' 
Ben GHCi bunu nasıl yapabilirim

? Desen eşleştirme kullanımı ('|') bir şeyi değiştirecek mi?

bar x y | x == 0  = 0 
     | y == 0  = 0 
     | otherwise = x * y 

GHCi bir satırda Yazılı: kullanarak korumaları için sözdizimi de

+1

Özgün 'bar'ınız desen eşleşmesini kullanır.[Muhafızlar] hakkında bilgi edinmek istiyorsunuz (http://en.wikibooks.org/wiki/Haskell/Truth_values#Guards). – dave4420

+2

Özellikle zeki olabilirsiniz ve yazabilirsiniz 'let bar | aksi halde = (*) '... – leftaroundabout

+3

İlk beklemeden önce' = 'öğesini kaldırın, bırakın çubuğu x y | x == 0 = ... | y == 0 = ... | aksi halde =. –

cevap

16

Bak

let bar x y | x == 0 = 0 | y == 0 = 0 | otherwise = x * y 
9

Kullanım dosyaları

GHCi doğrudan kodunuzu yazmayın Gerçekten tek liner olmadıkça.

bir metin dosyası olarak adlandırılan PatternMatch.hs kodunuzu kaydedin ve yazarak GHCi bunu yükleyin.

:l PatternMatch.hs 

ve

:r 

Alternatif yazarak size GHCi dosyayı yeniden yükleyebilirsiniz değişiklik yapmak (ve kaydetme) ise o zaman, içinde bulundukları egzersiz ya da sadece var sonra dosyalarınızı sayabilirim

gerçekten rehabilite kodu ise reusablle Temp.hs. bir metin dosyasına şeyler kaydederek

bunu çok daha kolay düzenlenebilir ve yeniden kullanılabilir hale.

Modüller

Daha sonra birlikte uygun bir modülü kullanarak ilgili işlevleri toplarsınız, bu yüzden diğer programlara ithalatçı olabilir. Örneğin,

module UsefulStuff where 

pamf = flip fmap 

Eğer

import UsefulStuff 

ve sonra orada UsefulStuff işlevleri kullanabilirsiniz başka dosyada sonra dosya adı verilen UsefulStuff.hs kaydedilir ve olabilir.

Modüller Eğer çaba yeraldığını kendinizi tasarruf edeceksiniz, tekrarlama, kaydetmek, yeniden derlemek, test overkill yapıyorsun şimdi, ama düzenleme iş akışı elde edeceğiniz içindir.

+0

21. yüzyıla hoş geldiniz. Dosyalar pirinç saplı bir kabine aittir. Bu günlerde ve serin çocukların JSFiddle'daki kodlarını plonladıkları ve Run butonuna bastıklarını ya da hızlı bir kum havuzunda dolaştıklarını anladıkları yaşta, bu cevap pek çok potansiyel Haskell programcısı üzerinde kazanmayacak. Gerçekten havalı çocuklar muhtemelen istedikleri tüm fonksiyonel programlama ve tip kontrol iyiliğine sahip olabilecekleri yer olan [Shen] 'e (http://www.shenlanguage.org/) gidiyorlar. Ve evet, çok satırlı girdi "kutunun dışında", imzaları ve tümünü sağlayan bir REPL var. – ack

+1

@ack Bence, havalı çocukların ne yaptığını umursayan bir kişi için beni suçluyorsunuz, oysa ben de insanların sadece kullandıkları araçlardan en iyi şekilde yararlanmasına yardım ediyorum. Sham hakkında spam için teşekkürler. – AndrewC

+0

Eğer bu kadar ilgilenirseniz, belki de [bu cevap] 'a (http://stackoverflow.com/a/8443096/588561) başvurarak dosya kullanımını gerektirmezdiniz. – ack