pure
yerine return
kullanırsanız, aynı davranışı alırsınız. Ne yapacağını öğrenmek için verilen ifade için ghci bir tür seçmelidir. ghci'nin varsayılan kuralları, diğer kısıtlamaların olmadığı şekilde, Applicative
veya Monad
örneğinde IO
'u seçer. Böylece, IO Integer
türünün bir ifadesi olarak pure 1
'u yorumlar. Komut satırında girilen IO a
türündeki ifadeler çalıştırılır ve sonuçları 1. a
ise Show
örneğine ve 2. a
()
değildir. Böylece
v <- return (1 :: Integer)
print v
return v
istemi sonuçlara pure 1
giren yürütülür (ve sihirli değişken it
geri v
bağlı) edilir. ()
böylece sadece return()
yürütüldüğünde, ilginç olarak kabul edilir ve it
pure (+1)
için, ()
bağlanması nedeniyle pure()
için özel bir durum var kapsamındaki fonksiyonları için hiçbir Show
örnek, bu yüzden hiçbir şey yazdırılır, bir işlev döndürülür geçerlidir. Bununla birlikte, kapsamı fonksiyonları için Show
örneğiyle
Prelude Control.Applicative> :m +Text.Show.Functions
Prelude Control.Applicative Text.Show.Functions> pure (+1)
<function>
it :: Integer -> Integer
Prelude Control.Applicative Text.Show.Functions> it 3
4
it :: Integer
, (değil bilgilendirici olduğunu) baskılı alır ve işlevi daha sonra kullanılabilir (ikinci elbette kapsamında olmak Show
örneği bağımsızdır).
Sadece "Örnek Uygulamalı IO" nun farkına vardım. Bu yüzden de saf 1 >> = \ it -> yazdırmaya izin verir. Sadece Text.Show.Functions' modülünü öğrendim. Her zaman işlevlerin neden varsayılan olarak gösterilmediğini merak ettim. – gawi
Aşağıda, Applicationative, Functor ve IO: 'pure (+1) <*> fmap (read :: String -> Int) getLine' kullanmanın bir örneği daha var. – nponeccop