簡體   English   中英

Functor用於(a - > b) - >(fa - > fb),什么是(類別c)=> cab - > c(fa)(fb)?

[英]Functor is for (a -> b) -> (f a -> f b), what is for (Category c) => c a b -> c (f a) (f b)?

我想有一個函數,用於將純函數映射到容器或通過它對應用/ monadic動作進行排序。 對於純映射,我們有

fmap :: Functor f => (a -> b) -> (f a -> f b)

對於monadic測序,我們有(來自Data.Taversable)

mapM :: (Traversable f, Monad m) => (a -> m b) -> (f a -> m (f b))

這是類似的

mapKleisli :: (Traversable f, Monad m) => Kleisli m a b -> Kleisli m (f a) (f b)
mapKleisli = Kleisli . mapM . runKleisli

我們知道( - >)和(Kleisli m)都是類別(和箭頭)。 所以自然要做出概括:

mapCategory :: (X f, Category c) => c a b -> c (f a) (f b)

你知道類似方法的X類嗎? 也許,在某個地方有hackage? 我試圖hoogle / hayoo但沒有找到任何合適的東西。

更新:

現在我知道我需要什么。 Kleisli箭頭和( - >)都是ArrowApply的實例,它和Monad一樣強大。 我想出了這個基於箭頭的Travesable版本:

{-# LANGUAGE TypeOperators #-}

import Prelude hiding (id, (.), mapM)
import Control.Arrow
import Control.Category

class Traversable f where
  traverse :: ArrowApply (~>) => f a -> (a ~> b) ~> f b

mapArrow :: (ArrowApply (~>), Traversable f) => a ~> b -> f a ~> f b
mapArrow a = arr (\x -> (traverse x, a)) >>> app

instance Traversable Maybe where
  traverse Nothing = arr (const Nothing)
  traverse (Just x) = arr (\a -> (a, x)) >>> app >>> arr Just

instance Traversable [] where
  traverse [] = arr (const [])
  traverse (x : xs) = undefined -- this is hard!

我可以使用通常的基於Applicative的Traversable,具有純函數的Identity,但我不確定它是好的。 將純函數視為monadic動作的特例是很奇怪的。 將純函數和monadic動作解釋為某個動作類(Category / Arrow / ArrowApply)的實例對我來說更直接。

問題:你想完成[]實例嗎? 我對ArrowApply vs Monad有什么看法嗎?

你要的是“某些類X”,但應該很清楚,這個類的最多(或許是唯一的)正確名稱是“Functor”。 你想要的只是為任意Category實例定義的仿函數類,而不是限於(->)

當然,您的定義仍限於(endo)仿函數,從類別到由給定實例的類型構造函數定義的子類別。 如果你進一步概括,那么兩個類別沒有理由相同,給你一個類似這樣的類型

class (Category r, Category t) => Functor f r t | f r -> t, f t -> r where
    fmap :: r a b -> t (f a) (f b)

與類別理論中的仿函數的完整概念相比,這仍然非常有限,但是哦。

有趣的是,它仍然有一個(->)類型的構造函數 - 這是因為,即使我們使用任意實例建模源和目標類別,整個事物(特別是仿函數本身)在某種意義上仍然存在於Hask中 ,即與(->)相關聯的類別。 對於類型構造函數f ,函數的另一半(部分映射對象)粗略地說是類型* -> *(->)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM