如果类型参数的顺序错误,是否可以将类型设为类的实例?

2024-04-07

考虑以下类型:

data SomeType m a = SomeType (m Integer) [a]

我们可以使用以下代码轻松地将该类型设为 Functor 的实例:

instance Functor (SomeType m) where
  fmap f (SomeType m lst) = SomeType m (map f lst)

但是,如果改为SomeType类型被交换:

data SomeType2 a m = SomeType2 (m Integer) [a]

那么上面的实例定义就不起作用了。

有什么方法可以制作吗SomeType2Functor 的一个实例?如果没有,haskell/ghc 是否有任何即将推出的补充可以使其成为可能?


我有偏见,但我认为这是一个利用的好机会控制.Newtype http://hackage.haskell.org/packages/archive/newtype/0.2/doc/html/Control-Newtype.html,一个小工具包,只需“cabal install newtype”即可。

事情是这样的。您想要翻转类型构造函数以了解不同参数中的功能(例如)。定义一个新类型

 newtype Flip f x y = Flip (f y x)

并将其添加到Newtype因此类

 instance Newtype (Flip f x y) (f y x) where
   pack = Flip
   unpack (Flip z) = z

The Newtypeclass 只是一个将新类型映射到其未修饰的等效项的目录,提供方便的工具包,例如op Flip是的倒数Flip: 你不需要记住你叫它什么。

对于所讨论的问题,我们现在可以这样做:

 data Bif x y = BNil | BCons x y (Bif x y) deriving Show

这是一个双参数数据类型,恰好在两个参数中都是函数。 (也许,我们应该将其设为 Bifunctor 类的实例,但无论如何......)我们可以将其设为Functor两次:最后一个参数一次...

instance Functor (Bif x) where
  fmap f BNil = BNil
  fmap f (BCons x y b) = BCons x (f y) (fmap f b)

...第一次:

instance Functor (Flip Bif y) where
  fmap f (Flip BNil) = Flip BNil
  fmap f (Flip (BCons x y b)) = Flip (BCons (f x) y (under Flip (fmap f) b))

where under p f是一个简洁的表达方式op p . f . p.

我没有告诉你任何谎言:让我们尝试一下。

someBif :: Bif Int Char
someBif = BCons 1 'a' (BCons 2 'b' (BCons 3 'c' BNil))

然后我们得到

*Flip> fmap succ someBif
BCons 1 'b' (BCons 2 'c' (BCons 3 'd' BNil))
*Flip> under Flip (fmap succ) someBif
BCons 2 'a' (BCons 3 'b' (BCons 4 'c' BNil))

在这种情况下,同一件事确实可以有很多种方式被视为Functor,所以我们必须发出一些声音来表达我们的意思,这是正确的。但如果你系统地对待它,噪音并没有那么大。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如果类型参数的顺序错误,是否可以将类型设为类的实例? 的相关文章

  • 如何在不声明新数据的情况下更改类型(String,Int)元组的 Ord 实例?

    我正在尝试对类型列表进行排序 String Int 默认情况下 它按字符串排序 然后按整数排序 如果字符串相等 我希望它是相反的 首先比较整数 然后如果相等则比较字符串 另外 我不想切换到 Int String 我找到了一种通过定义实例来实
  • 管道:多个流消费者

    我编写了一个程序来计算语料库中 NGram 的频率 我已经有一个函数 它消耗一串令牌并生成一个订单的 NGram ngram Monad m gt Int gt Conduit t m t trigrams ngram 3 countFre
  • 类型级别集结合律的证明

    我试图证明类型级函数Union https hackage haskell org package type level sets 0 8 5 0 docs Data Type Set html t Union是关联的 但我不确定应该如何完
  • C++ 概念与 Haskell 类型类有何不同?

    Concepts TS 中的 C 概念最近已合并到 GCC 主干中 概念允许人们通过要求类型满足概念的条件 例如 可比较 来约束通用代码 Haskell 有类型类 我对 Haskell 不太熟悉 概念和类型类如何相关 概念 由概念 TS 定
  • RankN多态性和令人发指的克莱斯利之箭

    我不明白为什么 demobind1 的定义会产生一些编译器错误 它看起来像一个愚蠢的翻转 但不知何故 LANGUAGE GADTs LANGUAGE RankNTypes ScopedTypeVariables TypeOperators
  • 如何同时将透镜(或任何其他光学器件)视为吸气剂和设置剂?

    我正在尝试编写一个通用记录更新程序 它允许人们轻松更新记录中的字段existing记录 字段形状相似incoming记录 这是我到目前为止所拥有的 applyUpdater fields existing incoming let gett
  • 自定义 monad 的 MonadTransControl 实例

    的文档monad control提供有关如何创建实例的示例MonadTransControl using defaultLiftWith and defaultRestoreT 该示例适用于以下情况newtype newtype Count
  • 如何使用foldr为列表创建显示实例?

    我想为我的数据类型 我的列表 编写自己的显示实例 到目前为止 我的方法是有效的 但我总是在末尾有一个逗号 我已经尝试用最后一个元素启动折叠并将其从列表中删除 但它很麻烦而且不起作用 有没有更简单的方法来获得正确的解决方案 实际 1 2 3
  • 在 Haskell 中将字符串转换为整数/浮点数?

    data GroceryItem CartItem ItemName Price Quantity StockItem ItemName Price Quantity makeGroceryItem String gt Float gt I
  • 如何从具有函数依赖关系的类型类中获取和使用依赖类型?

    如何从具有函数依赖关系的类型类中获取和使用依赖类型 为了澄清并给出我最近的尝试的一个例子 从我正在编写的实际代码中最小化 class Identifiable a b a gt b where if you know a you know
  • Haskell / cabal 包的解决方法受到 Nix 和 Cabal 的限制?

    我最近开始开发反射平台 https github com reflex frp reflex platform 有一些额外的配置类似于优秀的反射项目骨架 https github com ElvishJerricco reflex proj
  • 使用 Parsec 解析正则表达式

    我正在尝试通过实现一个小型正则表达式解析器来学习秒差距 在 BNF 中 我的语法类似于 EXP EXP LIT EXP LIT 我尝试在 Haskell 中实现这一点 expr try star lt gt try litE lt gt l
  • 这是 unsafeCoerce 的安全使用吗?

    我遇到的情况是 我目前正在使用极其可怕的函数 unsafeCoerce 幸运的是 这并不是为了任何重要的事情 但我想知道这是否是该函数的安全使用 或者是否有其他方法可以解决其他人知道的这个特定问题 我的代码类似于以下内容 data Toke
  • 如何让 esqueleto 为我生成 SQL 字符串?

    我怎样才能让esqueleto从a生成一个SQL字符串from陈述 的文档toRawSql说 你可以打开持久的查询日志记录 我尝试了所有可能的形式MonadLogger我可以理解 但它从未打印任何 SQL 同一文档还说 手动使用此功能 是可
  • 在 Archlinux 上使用 Vim 作为 Haskell 的 IDE 目前情况如何?

    如果可行的话 我的目标是通过 YouCompleteMe 在 Vim 中完成 Haskell 的命令 在这方面 正如您在下面看到的 我还没有找到关于如何让它发挥作用的共识 相关评论的最新评论YouCompleteMe 上的问题 https
  • 如何测试自定义 StateT 的 Monad 实例?

    我正在学习 Monad Transformers 其中一个练习要求实现 Monad 实例StateT 我想使用以下方法测试我的实现是否符合 Monad 法则validity https github com NorfairKing vali
  • 来自数据类型的 Haskell 随机数

    我对 Haskell 还很陌生 我有一个数据类型 data Sentence Prop Int No Sentence And Sentence Or Sentence deriving Eq 我已经为它写了一个 Show 实例 然而 无论
  • 为什么 GHC 在这里推断出单态类型,即使禁用了单态限制?

    这是由解析 f f pure 的类型 https stackoverflow com questions 55388119 resolving the type of f f pure 55388309 noredirect 1 comme
  • HASKELL:解决河内塔

    下面的代码解决了 hanoi 使用预定义函数 moveLOD swapLOI 和 swapLID 返回移动列表的问题 MoveLOD 将 1 个圆盘从第一个位置移动到三元组第三个位置中的第三个销钉 此外 包含有关运动信息的字符串会堆积在字符
  • Haskell:确定函数数量的函数?

    可以写一个函数吗arity a gt Integer确定任意函数的数量 使得 gt arity map 2 gt arity foldr 3 gt arity id 1 gt arity hello 0 是的 这可以非常非常容易地完成 ar

随机推荐

  • Bitbucket 与 Github 的优缺点比较 [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 Disclaimer This is a subjective question Please follow relevant guidelin
  • 可以在 Yii2 中更改动作类吗?

    是否可以更改动作类 http www yiiframework com doc 2 0 yii base inlineaction html Yii2以某种方式使用 类似于如何在配置文件中设置许多其他组件的类 我想扩展这个课程 这样我就可以
  • 如何在iOS SDK中删除两个字符串中的共同字母? [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 如何删除两个字符串中的常见字母并使用剩余的唯一字母生成新字符串 例如 String 1 Optimus Prime String 2 Dej
  • 如何使用 kotlin 显示在 recyclerview 中选择的单个项目

    我们如何标记单个项目被选中Recyclerview使用科特林 当我选择一个项目并单击其他项目时 应取消选择之前选择的项目 这是我在 kotlin 中的适配器类 class ListAdapter var context Context va
  • notificationDataSetChanged() 不刷新可扩展列表视图

    我在用Expandable ListView其中的数据通过填充Sqlite数据库 我已经提供了从中删除群组的选项ExpandableListView它实际上删除了相应的row在数据库中 但是该活动不会刷新 并且删除的 案例 是可见的 直到人
  • 使用 spring.NET 配置静态属性

    使用 spring NET 配置以下类的最佳实践是什么 using System Collections Generic using Edu3 DTOModel namespace Edu3 Data SubsonicProvider Re
  • distanceTo 返回什么距离?

    是否考虑了海拔变化 我的意思是 如果我从这个三角形的左顶点开始并在右上顶点结束 它返回距离a还是b double distanceInMetersFloat initialPosition distanceTo finalPosition
  • 通过键与字典项绑定

    假设我有一些字典 我想将该字典中的项目绑定到某些控件 并且我想通过项目键进行绑定 public partial class Window1 Window public Window1 InitializeComponent Dictiona
  • angerlySetInnerHTML 和

    我的页面需要本地化 我用的是gettext 我的i18n 函数返回翻译后的字符串并替换 s带有提供参数的符号 据我所知 我不能 危险的设定 一个 JSX 元素 但是我需要插入打开和关闭标签 我无法将字符串分成多个部分 因为后端为我提供了这样
  • 如何知道图像是 RGB 还是 BGR 格式?

    有没有办法提前知道用作系统输入的图像是 RGB 还是 BGR 格式 我正在使用 OpenCV 和 java API 我想将输入图像转换为灰度或 L a b 颜色空间 但在 OpenCV 中 您必须首先指定要转换的图像是 RGB 还是 BGR
  • Ruby 的“open_uri”是否在读取或失败后可靠地关闭套接字?

    我一直在使用open uri拉下 ftp 路径作为数据源一段时间 但突然发现我几乎连续不断地收到 530 抱歉 已连接允许的最大客户端数 95 我不确定我的代码是否有问题 或者是否是其他人正在访问服务器 不幸的是 我似乎无法真正确定谁有问题
  • 带值的 NSArray

    如何创建一个带有填充值的 NSArray 也就是说 NSArray name NSArray alloc insert these values raju biju ramu 使用 NSArray initWithObjects 方法 记住
  • 验证 Rails 中的参数

    在我的 Rails 应用程序中 我想验证filter and post type params 两者都是可选的 但如果它们存在 则它们必须具有一个值 并且必须具有与有效值数组中的一个相匹配的值 在我的控制器中 我有两种检查它们的方法 def
  • 使用 ng-change、AngularJS 进行日期输入验证

    我正在使用 AngularJS 和AngularJS 引导程序 http angular ui github io bootstrap 在我的页面中 我有一个日期选择器指令 如下所示 div class p class input grou
  • ASP.NET 5 Identity 3 用户在应用程序重新启动后注销

    我们正在使用 ASP NET Identity 3 我们的用户会随机自动注销 为了重现此问题 我尝试重新启动应用程序 所有用户都退出 即使是那些已检查过的用户Remember me 它只发生在生产中 在开发环境中运行良好 Update 我们
  • R 包拼凑:行/列标题

    有没有办法使用 patchwork 包按行或列添加标题来组合绘图 前任 安排为 拼凑 是的 有一种方法可以在生成的图的排列中放置行或列的标签patchwork通过使用textGrob正如评论之一所建议的 p1 lt ggplot iris
  • $this->post codeigniter 不适用于其余 api

    我尝试与 this gt post 获取以 json 格式通过 post 发送的数据 例如 我无法得到任何结果 this gt post name 这是代码
  • Python“正则表达式”模块:模糊值

    我正在使用 模糊匹配 功能Regex https pypi python org pypi regex 模块 如何获得 匹配 的 模糊度值 它指示模式与字符串的差异程度 就像 Levenshtein 中的 编辑距离 一样 我以为我可以获取
  • 添加 const 泛型时的“不受约束的泛型常量”

    我如何添加 const 泛型 假设我有一个 foo 类型 pub struct foo
  • 如果类型参数的顺序错误,是否可以将类型设为类的实例?

    考虑以下类型 data SomeType m a SomeType m Integer a 我们可以使用以下代码轻松地将该类型设为 Functor 的实例 instance Functor SomeType m where fmap f S