? (f, g)
'u denedim, ama tahmin ettiğim gibi - başarı olmadan.kısa yol yazmak için ( (x, y) -> (f x g y)) lambda daha özlü</p> <pre><code>(x, y) → (f x, g y) :: (a, b) → (c, d) </code></pre> <p>geç nasıl fonksiyonları <code>f :: a → b</code>, <code>g :: c → d</code> için
7
A
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
Yakın bir bakış, iki kısıtlı türün eşdeğer olduğunu ortaya çıkarır.
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)
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
https://hackage.haskell.org/package/base-4.9.0.0/docs/src/Data.Bifunctor.html#line-78 – dfeuer
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