2013-03-21 15 views
5

İyi günler millet. Monad'larda lütfen biraz açıklık arıyorum ve lütfen bind kullanın (bir kompozit içine girerken .). Yani bu örnek içinMonadları kompozitlere bağlama (Haskell)

:

--Monadic parts: 
readFile :: String -> IO File 
putStr :: String -> IO() 
-- Non monadic parts 
toMatrix :: String -> CustomMatrix 
toString :: CustomMatrix -> String 

Esasen ben tembel bir dosya (readFile) daha sonra, özel bir matris üreten bir dize çıkışına matrisi dönüştürme okuyorum

. Sonra geri dönüyor. Ben readFile file gitmek için bağlama >>= kullanarak bir karışıklık oluşturmaya başladığında

fileReading :: String -> IO 
fileReading file = putStr(toString . toMatrix . readFile file) 

budur. Kompozitleri . kullanmaya devam edebilmem ve okunamayan bir karışıklık yapmadan (gerçekten amacım değil) bağlama ve oluşturma yolunun bir yolu var mı?

Her zaman olduğu gibi, herhangi bir yardım minnetle alınır. Teşekkürler millet.

+2

Değişken ve işlev adları bir basamakla başlayamaz, bu nedenle sorgunuzda '2Matrix' ve' 2String' adını değiştiriyorum. – dave4420

+0

Özür dilerim. Fonksiyonlarımı düşünmeden kısaltıyordum. – BrownE

+1

Bazı monad 'm' için' a -> m b' tipi işlevler için '(.)' Benzetmesi '(<= <)' (Control.Monad'dan) olarak adlandırılır ve Kleisli Bileşimi olarak adlandırılır. Oluşturduğunuz şeyin türüne bağlı olarak '.' ile karıştırabilirsiniz. Örneğin. 'fileReading = putStr. toString. toMatrix <= luqui

cevap

7

Bu örnekte bazı monadic işlevini (>>= gibi) kullanmadan uzaklaşamazsınız. Aslında bazı IO'ları yapmak istiyorsanız, normal fonksiyon kompozisyonunu IO değerleri ile kullanamazsınız.

mutlu ki, hala oldukça okunabilecek kodu yazabilirsiniz: İki . operasyonlar son bir IO fonksiyonlu olmayan iki IO fonksiyonları birleştiren çünkü

fileReading file = readFile file >>= putStr . toString . toMatrix 

Bu çalışır. Bu noktada, iki IO değeriniz vardır: bir IO String ve bir String -> IO() işlevi (putStr . toString . toMatrix ifadesinin tamamı bu türe sahip). Bu tam olarak >>='un aldığı şeydir, dolayısıyla hepiniz ayartınız.

kod yukarıdaki aynı sırada olmasını isterseniz, geriye bağlama operatörünü kullanabilirsiniz: tüm kodu aynı yer "akar" çünkü

fileReading file = putStr . toString . toMatrix =<< readFile file 

Bazı insanlar daha okunabilir bu sürümünü bulmak yön.