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

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(使用前将#替换为@)

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

  • 显示未定义的实例

    可以采取任何措施来为未定义的值定义 Show 实例吗 也许存在一些 GHC 扩展 我想要这样的东西 gt print 1 undefined 1 undefined 根据Haskell 2010 报告 第 9 章 http www hask
  • 如何在 Yesod 中使用 CSS 框架?

    我想将 Blueprint CSS 框架与 Yesod 一起使用 有没有最佳实践 因为 Yesod 使用 CSS 模板 所以在我看来我不能直接使用 css 文件 我必须将它们重命名为 lucius files 吗 如何将 CSS 添加到 d
  • Haskell,optparse-generic 的未命名命令行参数

    我在用着optparse 通用 https hackage haskell org package optparse generic解析名为的程序的命令行参数example 我有一个带有命名字段的数据类型 记录语法 例如 data Exam
  • 使用 nix 在 Mac OS X 上由于“架构 x86_64 的未定义符号”而导致“堆栈构建”失败

    首先是错误消息 stack build Linking Users yuzhao stack setup exe cache x86 64 osx tmp Cabal simple mPHDZzAJ 2 2 0 1 ghc 8 4 4 cl
  • 在 Haskell 中计算移动平均线

    我正在学习 Haskell 所以我尝试实现移动平均函数 这是我的代码 mAverage Int gt Int gt Float mAverage x a fromIntegral k fromIntegral x k lt rawAvera
  • Haskell 类型系统的细微差别

    我一直在深入了解 haskell 类型系统的本质 并试图了解类型类的要点 我已经学到了很多东西 但我在下面的代码片段上遇到了困难 使用这些类和实例定义 class Show a gt C a where f Int gt a instanc
  • 将数据类型设置为 Kind * -> * 这不是函子

    布伦特 约尔吉类型分类百科全书 https www haskell org haskellwiki Typeclassopedia给出以下练习 举一个类型的例子 gt 不能将其制成 的实例Functor 不使用undefined 请告诉我什
  • Haskell:是的,没有类型类。为什么是整数?

    我有一个关于 GHCi 如何假定整数类型的问题 我正在阅读 Learn you a Haskell 是 否类型的课程 如果您想阅读全文 这里有一个链接 http learnyouahaskell com making our own typ
  • Haskell - 用防护罩替换外壳

    我想知道在这部分代码中是否可以用守卫替换 case 语句 firstFunction String gt Maybe MyType secondFunction MyType gt Integer myFunction String gt
  • “Eta减少”并不总是在Haskell中举行?

    我发现我可以说 LANGUAGE RankNTypes f1 forall b b gt b gt forall c c gt c f1 f id f HLint 告诉我我可以在这里做 Eta 减少 但是 f2 forall b b gt
  • 以下两个 lambda 函数的空间复杂度

    我正在阅读以下内容 https en wikibooks org wiki Haskell Graph reduction https en wikibooks org wiki Haskell Graph reduction 其内容如下
  • 使用 FoldLine 解析多个块

    对于这个简化的问题 我试图解析一个如下所示的输入 foo bar baz quux woo hoo xyzzy glulx into foo bar baz quux woo hoo xyzzy glulx 我尝试过的代码如下 import
  • Haskell / GHC - 是否有“警告不完整模式”的中缀标签/编译指示

    我正在寻找一个可以对特定的不完整模式发出警告的编译指示 它会使编译器失败并显示以下 假设的 代码 FAILIF incomplete patterns f Int gt Int f 0 0 我正在尝试使用 Arrows 编写一个 编译器 并
  • Haskell 中的尾递归字符串分割

    我正在考虑分割字符串的问题s在一个字符处c 这表示为 break c s 其中 Haskell 库定义break c 足够接近 br br s h t if c h then s else let h t br t in h h t 假设我
  • 找不到模块“Yesod”

    我有以下代码 LANGUAGE TypeFamilies QuasiQuotes MultiParamTypeClasses TemplateHaskell OverloadedStrings module Simple where imp
  • Haskell:IORef 的性能

    我一直在尝试在 Haskell 中编码一个需要使用大量可变引用的算法 但与纯粹的惰性代码相比 它 也许并不奇怪 非常慢 考虑一个非常简单的例子 module Main where import Data IORef import Contr
  • 我该如何实现这个折叠功能呢?

    给出了两种数据类型 颜色 和 植物 data Color Red Pink White Blue Purple Green Yellow deriving Show Eq data Plant Leaf Blossom Color Stal
  • Haskell 对于 Web 应用程序来说足够成熟吗? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 不同编程语言中的浮点数学

    我知道浮点数学充其量可能是丑陋的 但我想知道是否有人可以解释以下怪癖 在大多数编程语言中 我测试了 0 4 到 0 2 的加法会产生轻微的错误 而 0 4 0 1 0 1 则不会产生错误 两者计算不平等的原因是什么 在各自的编程语言中可以采
  • 如何在不声明新数据的情况下更改类型(String,Int)元组的 Ord 实例?

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

随机推荐

  • 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