当前位置: 首页 > 知识库问答 >
问题:

functor/类应用程序类型类,用于组成(A->A)函数而不是(A->B)?

杜昆琦
2023-03-14

我有一种类型看起来是这样的:

newtype Canonical Int = Canonical Int

和一个函数

canonicalize :: Int  -> Canonical  Int
canonicalize =  Canonical . (`mod` 10)  -- or whatever
cmap :: (b->Int) -> (Canonical b) -> (Canonical Int)
cmap f (Canonical x) = canonicalize $ f x

cmap2 :: (b->c->Int) -> (Canonical b) -> (Canonical c) -> (Canonical Int)
cmap2 f (Canonical x) (Canonical y) = canonicalize $ f x y
newtype Canonical a = Canonical { value :: a, canonicalizer :: a -> a }
instance (Functor Int) (Canonical Int) 

我也试过

newtype (Integral a) => Canonical a = Canonical a -- -XDatatypeContexts
instance (Integral a) => Functor Canonical where
  fmap f (Canonical x) = canonicalize  $ f x

但是GHC说DataTypeContexts是不推荐使用的,这是一个坏主意,更严重的是,我得到:

 `Could not deduce (Integral a1) arising from a use of 'C'   
 from the context (Integral a)
 bound by the instance declaration
 [...] fmap :: (a1 -> b) -> (C a1 -> C b)

我认为这是说约束integrala实际上不能用我希望的方式将fmap约束为(integral->Integral),这是很明显的(因为fmap有两个类型变量):-(

当然,这也是无效的,哈斯克尔

instance (Integer a) => Functor Canonical where

是否有类似的类型类我可以使用,或者我尝试使用类型类来实现“隐式规范化函数调用的结果”的功能是错误的?

共有1个答案

濮阳征
2023-03-14

我认为您试图实现的功能在单次可遍历包中是可用的,在本例中是单函子类型类。

 类似资料:
  • 问题内容: 当我看到Babel的编译代码时,它们似乎并不等效。实际上,前者转换为,而后者等效于(也许是?) 那有ES6风格吗?还是语法仍然保留在ES6中?还是在ES6中不再推荐该语法? 问题答案: 您可以使用 要么 哪个将导出为 在这里的互操作部分有一个解释。 为了鼓励使用CommonJS和ES6模块,在导出默认导出时,除之外还将设置其他导出。

  • 我想出了这两个: 我的例子正确地说明了这个练习吗? 给定两个参数: null null 我在SO上看到了一些类似的问题(比如,这个问题),这个问题几乎是我要找的,但不完全是(我只是在找函数的例子,没有别的--没有应用性,没有单子)。

  • 我尝试了一些代码在Java中交换两个整数,而不使用第三个变量,即使用XOR。 以下是我尝试的两个交换函数: 该代码产生的输出如下: 我很想知道,为什么会有这样的说法: 和这个不一样?

  • 问题内容: 我尝试了一些代码,使用XOR在Java中交换两个整数而不使用第三个变量。 这是我尝试的两个交换函数: 这段代码产生的输出是这样的: 我很好奇,为什么这样说: 与这个不同吗? 问题答案: 问题是评估的顺序: 参见JLS第15.26.2节 首先,对左操作数求值以产生一个变量。 如果该评估突然完成,则赋值表达式由于相同的原因而突然完成;右边的操作数不会被评估,并且不会发生赋值。 否则,将保存

  • 我试图在Python3.5中使用类型提示。1,代码如下: 我猜在解析类型A时,类型A还没有完全构造,这是范围界定的问题,但我不理解为什么这样的语法不正确。是否有其他方式来表达它,或者它只是一个非法的构造? 我想在基类中使用这个语法提示,它可以在树状层次结构中组成派生类。

  • 问题内容: 今天,我发现了python语言一个有趣的“功能”,这让我感到非常悲伤。 那个怎么样?我以为两者是等同的!更糟糕的是,这是我调试时遇到的麻烦的代码 WTF!我的代码中包含列表和字典,并且想知道我到底怎么把dict的键附加到列表上而又没有调用.keys()。事实证明,这就是方法。 我认为这两个陈述是等效的。即使忽略这一点,我也可以理解将字符串追加到列表的方式(因为字符串只是字符数组),但是