2016-08-09 19 views

cevap

16

(,) ait Bifunctor örneği aradığınız budur:

instance Bifunctor (,) where 
    bimap f g (a, b) = (f a, g b) 

bimap bir tuplea, her elemana birine iki işlevi uygular.

> import Data.Bifunctor 
> bimap (+1) (*5) (1,1) 
(2, 5) 

Sen bimap ve (***) arasındaki fark nedir merak ediyor olabilirsiniz. O p ~ (,) ile bimap tipi (***) ile

(a -> b) -> (c -> d) -> (a, c) -> (b, d). 

haline gelmesi bimap ile

> :t bimap 
bimap :: Bifunctor p => (a -> b) -> (c -> d) -> p a c -> p b d 
> :t (***) 
(***) :: Arrow a => a b c -> a b' c' -> a (b, b') (c, c') 

, size türünü kısıtlayabilirsiniz, oldukça keyfi bir bifunctor p daha küpe türünü kısıtlayabilir a'dan ziyade, a ~ (->) ile (***) tipi

olur

Yakın bir bakış, iki kısıtlı türün eşdeğer olduğunu ortaya çıkarır.

+4

Ne yazık ki, bu tam olarak “Bifunctor” örneği değil. Aslında, sadece "ahlaki açıdan doğru" olan ve dikkatli değilseniz bir boşluk sızıntısına neden olabilecek f g ~ (x, y) = (f x, g y) 'ı bimap. – dfeuer

+0

https://hackage.haskell.org/package/base-4.9.0.0/docs/src/Data.Bifunctor.html#line-78 – dfeuer

+0

Oops, ben * düşündüm * Onu buradan kopyaladım (https: //hackage.haskell.org/package/bifunctors-3.2.0.1/docs/src/Data-Bifunctor.html), ama görünüşe göre değil. Gözüm, '~ 'üzerinde gözlerini kamaştırmış olmalı. – chepner

9

Bu deneyin Control.Arrow yani

f *** g 
7

den (***) kullanabilir

import Control.Arrow 

answer = f *** g $ (a, c) 

ör

import Control.Arrow 

f :: Int -> Int 
f = (+1) 

g :: Double -> String 
g = show 

answer = f *** g $ (10, 3.5) 
İlgili konular