2014-02-28 56 views
13

是否有任何不是Applicative的好例子Functor?好的,我正在尋找不需要申訴undefined的非平凡(不是Const Void)的例子。如果沒有任何方法可以證明那裏的空間是無趣的?沒有應用程序的仿真器的例子

這與Good examples of Not a Functor/Functor/Applicative/Monad?類似,但在那裏沒有完全解決。

作爲後續問題,有沒有可能不Applicative情況下,留給由於有太多的不規範Applicative情況下是有意義的Functor S的任何有趣的例子?例如,「擴展Maybe」是有點無聊

data MayB a = Jus a | Nothing1 | Nothing2 | Nothing3 | ... 

instance Applicative MayB where 
    pure = Jus 
    Jus f <*> Jus x = Jus (f x) 
    Jus f <*> n  = n 
    n  <*> Jus x = n 
    n1 <*> n2 = methodOfResolvingNothingWhatsoever n1 n2 

是否有例子,其中Applicative實例的變化是更多的物質?

+0

作爲邊注,'數據MAYB一個=只求一個| Nothin Int'和'Nothin n1 <*> Nothin n2 = Nothin $ max n1 n2'是我如何實現它的。然後你會看到更高層次優先的失敗等級的概念。不確定這在哪裏有用,但很容易編碼。 – bheklilr

+2

定義無趣會很好。據我所知,'Cont m'是一個應用iff'm'是一個幺半羣,因此有很多函數 - 那裏沒有應用。基本上,任何與我們定義函數的參數無關的「結構」很多的東西都將很難成爲應用程序。 – jozefg

+0

@bheklilr這很明智,還有「純粹應用的Either」數據Eit b a = L b |具有實例Monoid b => Applicative(或b)其中L b1 <*> L b2 = L(b1 <> b2)'。但是,通常情況下,融合失敗的方法有很多,「純粹適用於任一」是我所知道的與規範方法最接近的東西。 –

回答

5

我看到functor而不是applicatives的主要地方是大型產品類型。考慮像

data Mean where 
    Unfair :: Monad a => a() -> Mean 
data Foo a = Bar Int Mean a 

這是很容易函子,但有沒有辦法使這是一個應用性,因爲

(Bar i g f) (Bar i' g' a) = Bar ??? ??? (f a) 

我們可以在??? s的東西,這是一個獨異樣在只填寫至少有一種方法和Mean從來沒有,因爲我們沒有辦法指定某些東西來以關聯的方式組合任意類型g :: ag' :: b的兩個值。

此外,我們需要mempty或類似的東西pure :: a -> f a。我們得到了一個a,因此涉及到a的大部分數據類型都是微不足道的構造,但其餘的需要一個理智的「空」值。

所以如果我們把應用和仿函數砸成一個大類,大部分lens都會崩潰,因爲鏡頭的大多數有用的例子都涉及這樣的情況,其中沒有一個理智的實例。我們需要一種合併所有類型參數的方法來解決這個問題,所以我們需要一種方法來合併所有的類型這種「東西」並不總是可能的。

+2

'Int - > Bool'可以在很多方面變成一個monoid。 「Bool」可以用我認爲的四種方式做成一個monoid,然後你多次使用產品「Int」。 –

+0

'實例Monoid(Int - > Bool)其中{mempty = const False; mappend f1 f2 = \ x - > f1 x || f2 x}' – Tarmil

+0

你也可以總是定義最左邊的monoid:'Bar i g f <*> Bar __ a = Bar i g(f a)' –

3

一個很重要的(如果不公平)的例子是

{-# LANGUAGE ExistentialQuantification #-} 

data AFunctor a = forall f . Functor f => AFunctor { unFunct :: f a } 
相關問題