2011-10-31 21 views
8

:ghci özel durum? GHCi olarak

λ> :t (pure 1) 
(pure 1) :: (Applicative f, Num a) => f a 
λ> show (pure 1) 

<interactive>:1:1: 
    No instance for (Show (f0 a0)) 
     arising from a use of `show' 
    Possible fix: add an instance declaration for (Show (f0 a0)) 
    In the expression: show (pure 1) 
    In an equation for `it': it = show (pure 1) 
λ> pure 1 
1 

mu Uygulanabilir yürütmek GHCi ve sadece IO gibi, sonucu görüntüler demek?

pure() ve pure (+1)'un hiçbir şey yazdırmayacağını unutmayın.

cevap

11

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 itpure (+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).

+2

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

+0

Aşağıda, Applicationative, Functor ve IO: 'pure (+1) <*> fmap (read :: String -> Int) getLine' kullanmanın bir örneği daha var. – nponeccop