(newtype Mu f = InF {outF :: f(Mu f)})的Functor实例

use*_*830 3 haskell functor

这让我很难过.你是如何编写Functor实例的?newtype Mu f = InF {outF :: f (Mu f)}

red*_*neb 7

你不能.为了Functor c为某些人定义一个实例c,c必须是那种* -> *.所以在你的情况下,Mu应该是那种,这意味着它的论点f必须是那种*.但显然事实并非如此,因为你正在应用f其他东西(to Mu f).

更简单地说,如果Mu是一个仿函数,你可以使用任何fmap类型的值.但这可以让你将类型参数更改为任何其他类型,例如,通过将函数应用于任何值,它将必须返回一个值.但是你不能形成这样的值,因为该值的类型没有意义.Mu fffmap (const (0 :: Int))Mu fMu IntoutFInt (Mu Int)

  • 我会添加显式的类型签名 `Mu :: (* -> *) -> *` 来强调它不是 `Functor` 所需的签名(`* -> *` 如上所述),所以我们得到一个错误。 (2认同)

sha*_*ang 5

redneb 很好地解释了为什么Mu不能是常规的,但您可以为asFunctor实现一种类似函子的映射操作Mu

{-# LANGUAGE RankNTypes #-}

newtype Mu f = InF {outF :: f (Mu f)}

mumap :: Functor f => (forall a. f a -> g a) -> Mu f -> Mu g
mumap f (InF m) = InF $ f $ fmap (mumap f) m
Run Code Online (Sandbox Code Playgroud)

虽然我不确定它对你的情况有多大用处。:)

  • IOW `Mu` 是一个函子,从类型构造函数 `* -> *` 的范畴(其态射是自然变换 `forall x.fx -> gx`)到 Haskell 类型 `*` 和函数的范畴 (2认同)