2011-08-24 12 views
6

:fmap çatal işlevleri aşağıdaki şekilde fonksiyonlarını oluşturmak isteyen

compose (==) (myReverse . myReverse) id [1..100] 

Ben böyle bir şeyle basitleştirilmiş olabileceğini düşünüyorum: Biz şu şekilde kullanabilirsiniz Böylece

compose :: (a->b->c) -> (d->a) -> (d->b) -> d -> c 
compose f g h x = f (g x) (h x) 

'fmap', böylece 'bestelemek' hiç tanımlamamalı. Ama bunu nasıl yapacağımı anlayamadım. Muhtemelen çok Control.Arrow kullanabilirsiniz

s f g x = f x (g x) 

:

+0

Sağladığınız şey en basit ve okunabilir çözümdür. Bunun için başka bir "yoğun" kod çözümü olabilir, ancak basit ve okunabilir kodu tercih ederim :) – Ankur

cevap

11

Eğer işlevlerine (==) <$> (myReverse . myReverse) <*> id $ [1..100]

<*> uzman S-combinator eşdeğerdir yazabilir, o zaman, Control.Applicative Yani

compose f g h = f <$> g <*> h 

aktarırsanız :

compose f g h = g &&& h >>> uncurry f 
test = uncurry (==) <<< (myReverse <<< myReverse) &&& id $ [1..100] 

Güncelleme

Ben #haskell aynı soruyu en lambdabot sordunuz ve o sadece liftM2 cevap verdi. : D

+0

+ 1, güzel cevap. Yarı noob olarak her iki çözümü de kendim almayı denedim, çok yaklaştım ama yapmadım ('uncurry' ile bestelemek için' '<<<'' özledim). –

+0

Aslında '<<<', '.' ile eşdeğerdir. Bu, işi yapan (& argümanını) yapan '&&' dir. – Rotsor

+1

"<<<" nin kompozisyon olduğunu biliyorum, ama "uncurry (==) ((reverse. Reverse) &&& id) $ [1..100]' ile gizlendim. Bu da arka planda oldukça aptalca. –

İlgili konular