[英]Can Haskell Typeclasses be Partially Implemented?
我想制作一个 pair 类型来表示模运算。 我做了它的构造函数
{- LANGUAGE GADTs -}
data Zn e where
Zn :: Integer -> Integer -> Zn Integer
因为我希望能够fmap
覆盖它和所有的东西。 所以如果我试着让它成为一个Functor
实例
instance Functor Zn where
fmap f (Zn s n) = Zn s $ mod (f n) s
我Could not deduce: b ~ Integer from the context: a ~ Integer
。 当然它不能推断出这一点,因为这种数据类型没有fmap:: (a -> b) -> Zn a -> Zn b
对于所有a
和b
的有意义的概念,但只要a
和b
是这样的实际上可以从它们构造Zn
实例(即Integer
)。 我也尝试过使用Zn
构造函数,所有方法都需要Integral e
但我遇到了类似的问题。 在这种情况下, s
类型a
,因此用它构造Zn
并且fn:: b
失败。 在第二种情况下,我可以将s
从a
转换为Integer
,然后再转换为b
,但这很笨重。 整个事情有点笨拙。 我这样做是因为我希望能够在映射 function 之后实现Functor
和Applicative
来执行mod
,这样我就可以将+
实现为liftA2 (+)
等等。 模数s
应该是类型的一部分,但据我所知,依赖类型在 Haskell 中不实用。
是否有可能只为某些 arguments 使用类型* -> *
实现Functor
?
您正在寻找MonoFunctor
。 它就像Functor
,但使用固定的内部类型而不是参数多态。 以下是您如何为您的类型实现它:
{-# LANGUAGE TypeFamilies #-}
import Data.MonoTraversable
data Zn = Zn Integer Integer
type instance Element Zn = Integer
instance MonoFunctor Zn where
omap f (Zn s n) = Zn s $ mod (f n) s
但是,请注意,这种情况并不完全合法。 您最好只制作一个modMap
function 或其他东西,以避免人们对其工作方式做出错误的假设。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.