gpt4 book ai didi

haskell - 用于组合 (a->a) 函数而不是 (a->b) 的仿函数/类似应用程序的类型类?

转载 作者:行者123 更新时间:2023-12-04 23:22:18 26 4
gpt4 key购买 nike

我有一个看起来像这样的类型:

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

这在表面上与 Functor 和 Applicative 相似,但并不完全相似,因为它太特化了:除非 'b' 是 Int,否则我实际上无法组合函数(按照 Functor/Applicative 的同态定律的要求)。

我的目标是使用现有的库函数/组合器,而不是编写我自己的变体,如 cmap , cmap2 .那可能吗?是否有不同的类型类或不同的方式来构建规范类型,以实现我的目标?

我试过其他结构,比如
newtype Canonical a = Canonical { value :: a, canonicalizer :: a -> a }

但这遇到了相同的不可组合性问题,因为我无法将一个规范化器转换为另一个(我只想使用结果类型的规范化器,它总是 Int (或 Integral a )

而且我不能像这样强制“仅特化”,这不是有效的 Haskell:
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)

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

当然这也不是有效的 Haskell
instance (Integer a) => Functor Canonical where

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

最佳答案

我认为您想要实现的目标可以在 mono-traversable 中找到。包,在这种情况下是 MonoFunctor 类型类。

关于haskell - 用于组合 (a->a) 函数而不是 (a->b) 的仿函数/类似应用程序的类型类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20777753/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com