
Ross Paterson wrote:
No. Choose an arbitrary element shape :: f () and define point x = fmap (const x) shape
Interesting. Is the arbitrariness of the shape some sort of evidence that Pointed is not really a very useful class in its own right? Certainly, the shape does matter if you plan to progress to non-trivial Applicative or Monad instances. For example, the non-determinism monad requires shape = [()], while the ZipList applicative functor requires shape = repeat (). Eugene Kirpichov wrote:
'An arbitrary element' means 'undefined will suffice' point x = fmap (const x) undefined
Well, that would rather limit the possible Applicative instances. :-) (Consider the Applicative law: fmap g x = pure g <*> x) Brent Yorgey wrote:
Prelude> fmap (const 1) [()] [1] Prelude> fmap (const 1) undefined *** Exception: Prelude.undefined
True, but as far as I can tell, that doesn't violate any laws of the Pointed class. To put it crudely, if [] is as good as [()], then how is undefined any worse?