SORU
7 Mart 2010, Pazar


Haskell acemi soru: Ne "kaldırma"?

""Dir. kaldırma ne anlamıyorum İlk önce anlayış Monadlar ne bir "" (Monadlar da henüz:) hakkında tamamen cahilim ? asansör anlamalıyım Ya da birisi basit kelimelerle bana açıklayabilir mi ?

CEVAP
7 Mart 2010, Pazar


Kaldırma matematiksel bir kavram (burada birini bekliyorum, ancak şimdi asansörleri kategorisi nasıl falan göstererek beni çürütmek) tasarım deseni.

Genellikle bir parametre ile bazı veri türü var. Gibi bir şey

data Foo a = Foo { ...stuff here ...}

Sanırım bulmak çok kullandığı toz ol da sayısal türler (İnt, Double vs.) ve tutmak zorunda kod yazmak için bu yeteneğini inceliyor bu rakamlar, ekler ya da çarpar onları ve sonra onları geri sarar. Bir kez aç-ve-wrap kodunu yazarak kısa devre bu. Bu işlev "asansör" bu gibi görünüyor, çünkü: . geleneksel denir

liftFoo2 :: (a -> b -> c) -> Foo a -> Foo b -> Foo c

İki fonksiyonu bir argüman alır bir işlevi var, diğer bir deyişle (gibi ) operatör) ve döner eşdeğer içine Foos için işlev.

Şimdi yazabilirsiniz

addFoo = liftFoo2 ( )

Edit: daha fazla bilgi

Elbette liftFoo3, liftFoo4 ve benzeri olabilir. Ancak bu çoğu zaman gerekli değildir.

Gözlem ile başlar

liftFoo1 :: (a -> b) -> Foo a -> Foo b

Ama bu tam olarak fmap aynıdır. LiftFoo1 yerine daha çok yazarsınız

instance Functor Foo where
   fmap foo = ...

Eğer gerçekten tam bir düzenlilik istersen söyleyebilirsin

liftFoo1 = fmap

Eğer bir functor içine Foo yapabilirsen, belki uygulamalı bir functor yapabilirsiniz

import Control.Applicative

instance Applicative Foo where
   pure x = Foo $ ...   -- Wrap 'x' inside a Foo.
   (<*>) = liftFoo2 ($)

(≪*>değilse, operatör türü vardır

(<*>) :: Foo (a -> b) -> Foo a -> Foo b

Sarılmış değeri kaydırılan işlevi için geçerlidir. Eğer liftFoo2 uygulayabilirsiniz eğer öyleyse açısından bu yazabilirsiniz. Ya da doğrudan uygulamak ve Kontrol çünkü liftFoo2, rahatsız değil.Uygulamalı modül içerir

liftA2 :: Applicative f => (a -> b -> c) -> f a -> f b -> f c

ve aynı şekilde liftA ve liftA3 vardır. Ama aslında başka bir operatör var çünkü onları çok sık kullanmayın

(<$>) = fmap

Bu yazabilirsiniz:

result = myFunction <$> arg1 <*> arg2 <*> arg3 <*> arg4

Terim "myFunction < $>arg1" yeni bir işlev Foo sarılmış verir. Bu da bir sonraki argümanı kullanarak (<*>uygulanabilir ) ve benzeri. Şimdi her parametre için bir asansör işlevi yerine, sadece applicatives zincirleme var.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Dogbert files

    Dogbert file

    12 Ocak 2012
  • Kevin Bruckert

    Kevin Brucke

    30 Aralık 2006
  • sk8ingis4me

    sk8ingis4me

    16 Mart 2006