2016-03-22 27 views
1

Bu etikete ilk kez yazıyorum ve hala dil ile geçici adımlar atıyorum, ancak bazı dinamik FP arka planım var, bu yüzden zaten birkaç kavramla tanıştım.Belirsiz türlerle kompozisyon

Bir isZero işlev tanımladım.

isZero :: Int -> Bool 
isZero x = x == 0 

Ve bir isMultiple fonksiyonunu oluşturmak için mod fonksiyonu ile bu oluştururlar çalışıyorum. o (birden çok precisions destekler çünkü bu olduğunu varsayarak) a0 -> Int ve moda0 -> a0 -> a0 olduğunu olmasını imzayı bekliyor çünkü

isMultiple = isZero . mod 

Ancak bu, bir tür uyumsuzluğu neden olur.

Sadece bunları açıkça oluşturuyorsam (ve bir tür imzası), o zaman sorun olmadığını fark ettim.

isMultiple :: Int -> Int -> Bool 
isMultiple x n = isZero $ mod x n 

. operatörünü kullanarak belirsiz türleriyle oluşturma işlevlerini kullanmak için bir yolu var mı?

+2

'\ x -> isZero. mod x = \ x -> (.) isZero (mod x) = (.) isZero. mod ' – user2407038

cevap

6

Eh, en isMultiple senin ilk tanımı türlerine bir göz atalım: Gördüğünüz gibi

(.)   :: (b -> c ) -> (a -> b   ) -> a -> c 
isZero   :: Int -> Bool 
mod   ::     Int -> Int -> Int 
        -- same as  Int -> (Int -> Int) 

, hem b 'ın aynı değildir. Bu yüzden işe yaramıyor. Ancak, bir işe alabilirsiniz ama bu artık gözle o kadar kolay değil:

isMultiple = (isZero.) . mod 
      = ((.) isZero) . mod 
      = \x -> ((.) isZero) . mod $ x 
      = \x -> ((.) isZero) (mod x) 
      = \x -> (.) isZero (mod x) 
      = \x -> isZero . mod x 

Gördüğünüz gibi, mod xInt -> Int yazın sahiptir ve bu nedenle (.) ve isZero ile kompozisyon için uygundur.

+0

Tamam, bu yüzden tutarsızlık LHS 'b'' ın bir 'ın' beklemesini umuyor ama bir' (Int -> Int) 'oluyor mu? Yani problem> = iki argümanı bekleyen bir fonksiyon yaratıyor? –

+2

@DanPrince: Temel olarak, evet (BU durumda; 'map. Mod' örneğin bu soruna sahip değildir, fakat bu farklı anlamlara sahiptir). Fakat bunun başka bir uygulamasıyla() elde etmek mümkündür. Bir [araç] var (http://pointfree.io/), fakat kodun mümkün olduğu kadar üç ay içinde sarhoş özünüz tarafından okunmasını istediğinizi unutmayın. – Zeta