繁体   English   中英

Haskell 类型类可以部分实现吗?

[英]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对于所有ab的有意义的概念,但只要ab是这样的实际上可以从它们构造Zn实例(即Integer )。 我也尝试过使用Zn构造函数,所有方法都需要Integral e但我遇到了类似的问题。 在这种情况下, s类型a ,因此用它构造Zn并且fn:: b失败。 在第二种情况下,我可以将sa转换为Integer ,然后再转换为b ,但这很笨重。 整个事情有点笨拙。 我这样做是因为我希望能够在映射 function 之后实现FunctorApplicative来执行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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM