如何在 Haskell 中向 Functor 实例声明添加类约束?

2023-11-30

我定义了以下数据类型:

data Probability a = PD { mass :: [(a, Ratio Int)] } 

现在我想写它是一个实例Functor:

collect :: (Eq a, Num b) => [(a, b)] -> [(a, b)]
collect al = map collect' keys where
    keys = nub $ map fst al
    collect' k = (k, sum (map snd (matches k)))
    matches k = filter ((==) k . fst) al

instance (Eq a) => Functor (Probability a) where
    fmap f p = PD (collect $ map (first f) (mass p))

但是,我收到以下错误:

Kind mis-match
The first argument of `Functor' should have kind `* -> *',
but `Probability a' has kind `*'
In the instance declaration for `Functor (Probability a)'

我怎样才能添加必要的Eq a约束? (我使用的是 GHC 7.4.1)


可悲的是,你不能这样做——Functor实例必须不受限制地接受任何类型的映射函数。

不过,你可以假装它。

newtype PF a = PF { unPF :: forall r . Eq r => (a -> r) -> Probability r }

instance Functor PF where
  fmap f (PF p) = PF (\mp -> p (mp . f))

在这里,所有将被映射的函数Probability已被“推迟”PF。我们通过“降低”回到Probability如果可能

lowerPF :: Eq a => PF a -> Probability a
lowerPF pf = unPF pf id

为了转换Probability into a fmappable PF我们必须“举起”它

liftPF :: Probability a -> PF a
liftPF p = PF $ \mp -> PD (collect $ map (first mp) (mass p))
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Haskell 中向 Functor 实例声明添加类约束? 的相关文章

  • Data.Sequence 中的 inits 和 tails 如何工作?

    Louis Wasserman 编写了当前的实现inits and tails in Data Sequence 他表示它们非常高效 事实上 只要查看代码 我就可以看到 无论它们在做什么 它们都是以干净 自上而下的方式进行的 这往往会给惰性
  • 检查对以下内容的理解:“变量”与“变量” “价值”、“功能”与“抽象”

    这个问题是后续问题this one https stackoverflow com questions 25327705 is function a sort of variable 25329157 25329157在学习 Haskell
  • Haskell:不在范围内:数据构造函数

    今天开始在学校学习 haskell 我遇到了函数问题 我不明白为什么它不在范围内 代码如下 ff Char gt Char gt Char ff A B x 0 y 1 x lt A y lt B x 1 y 0 和错误 md31 hs 2
  • 为什么在 where 子句中使用类型签名如此罕见?

    它是否有助于编译器优化 或者只是添加额外类型签名的多余工作 例如 人们经常看到 foo a gt b foo x bar x where bar x undefined 而不是 foo a gt b foo x bar x where ba
  • 如何在haskell中用另一个字符串替换一个字符串

    我想用不同的字符串替换输入文件中的字符串 我正在寻找一种方法 但似乎我只能逐个字符地更改字符串 例如在我下面的代码中 replace String gt String replace replace x xs if x then y rep
  • 函数式语言中的部分求值和函数内联有什么区别?

    我知道 函数内联就是用函数定义代替函数调用 部分评估是在编译时评估程序的已知 静态 部分 在 C 等命令式语言中 两者之间存在区别 其中运算符与函数不同 但是 在像 Haskell 这样的函数式语言 其中运算符也是函数 中 两者之间有什么区
  • 自定义 monad 的 MonadTransControl 实例

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

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

    The 文档 http haskell org ghc docs latest html libraries array 0 3 0 3 Data Array html of Data Array reads Haskell 提供了可索引数
  • Haskell 中的所有内容都存储在 thunk 中吗,甚至是简单的值?

    以下值 表达式 函数的 thunk 在 Haskell 堆中是什么样子的 val 5 is val a pointer to a box containing 5 add x y x y result add 2 val main prin
  • 管道 - 将多个来源/生产者合并为一个

    我正在使用读取文件sourceFile 但我还需要在处理操作中引入随机性 我认为最好的方法是拥有一个这样的制片人 Producer m StdGen ByteString 其中 StdGen 用于生成随机数 我打算让生产者执行 source
  • Haskell 中多核编程的现状如何?

    Haskell 中多核编程的现状如何 现在有哪些项目 工具和库可用 有哪些经验报道 2009年至2012年期间 发生了以下事件 2012 从 2012 年开始 并行 Haskell 状态更新开始出现在并行 Haskell 摘要 http w
  • Python 比编译的 Haskell 更快?

    我有一个用 Python 和 Haskell 编写的简单脚本 它读取包含 1 000 000 个换行符分隔的整数的文件 将该文件解析为整数列表 对其进行快速排序 然后将其写入已排序的不同文件中 该文件与未排序的文件具有相同的格式 简单的 这
  • 使用 Parsec 解析正则表达式

    我正在尝试通过实现一个小型正则表达式解析器来学习秒差距 在 BNF 中 我的语法类似于 EXP EXP LIT EXP LIT 我尝试在 Haskell 中实现这一点 expr try star lt gt try litE lt gt l
  • 并行 Haskell - GHC GC 火花

    我有一个正在尝试并行化的程序 带有可运行代码的完整粘贴here http lpaste net 101528 我进行了分析 发现大部分时间都花在findNearest这本质上是一个简单的foldr超过一个大Data Map findNear
  • 与 Functor 不同,Monad 可以改变形状?

    我一直很喜欢以下关于单子相对于函子的力量的直观解释 单子可以改变形状 函子不能 例如 length fmap f 1 2 3 总是等于3 然而 对于单子来说 length 1 2 3 gt gt g往往不等于3 例如 如果g定义为 g Nu
  • 如何测试自定义 StateT 的 Monad 实例?

    我正在学习 Monad Transformers 其中一个练习要求实现 Monad 实例StateT 我想使用以下方法测试我的实现是否符合 Monad 法则validity https github com NorfairKing vali
  • 如何与更高级别的类型合作

    玩弄教堂的数字 我遇到了无法指导 GHC 类型检查器处理高阶类型的情况 首先我写了一个版本 没有任何类型签名 module ChurchStripped where zero z z inc n z s s n z s natInteger
  • Cabal:使用源代码构建目录

    我有一个src目录 在这个目录中我有Main hs文件和Test目录 在里面Test我有的目录Test hs模块 我需要用 cabal 来编译它 在我的阴谋集团文件中 我有 Executable main hs or lhs file co
  • 函数式语言与语言实现的角度有何不同

    出现了全新的 函数式编程 范式 与过程式编程相比 它需要彻底改变思维模式 它使用高阶函数 纯度 单子等 我们通常在命令式和面向对象语言中不会看到这些 我的问题是如何执行这些语言与命令式或面向对象语言的不同之处在于 例如内存管理或指针等内部结

随机推荐

  • getContentResolver().openOutputStream(uri) 提供商不支持文件

    我想在我的个人内容提供商中存储文件音频 我保存记录 Uri uri getContentResolver insert CONTENT URI 值 OutputStream os getContentResolver openOutputS
  • 文件名不能为空

    每次点击提交按钮时都会出现此错误 其他所有内容都会提交到数据库 只有图像不会 警告 file get contents 文件名不能为空 任何想法 这是我的代码 if isset POST consultationbutton image a
  • 为什么 scipy.optimize.curve_fit 无法正确拟合数据?

    一段时间以来我一直在尝试使用函数来拟合某些数据scipy optimize curve fit但我确实有困难 我真的看不出这行不通的任何原因 encoding utf 8 from future import print function
  • Javascript 计算字符串中字母的频率

    我一直在尝试找出这个练习的答案 但一定有一个我看不到的错误 我将分享练习的描述 我的代码以及最后的输出 描述 现在我们将把每个数组的最长长度保存在一个名为 array lengths 的新数组中 打开控制台并重新加载索引页以查看代码的结果
  • 在 Hyperledger Composer 交易中以确定性方式获取时间戳

    是否有一种确定性的方法可以在事务函数中获取时间戳 类似于可以在 Go 版本的 Fabric 链码中使用的 stub GetTxTimestamp 只是分享一个适用于的示例basic sample network网络 在模型文件中 lib o
  • 负面展望未按预期发挥作用

    我有一个奇怪的情况积极的前瞻按预期工作 但是负前瞻没有 请看一下下面的代码
  • 如何创建 3 路 ManyToMany 关系 django

    需要在 django admin 中对服务器 应用程序和服务器角色之间的关系进行建模 服务器可以有one or 许多应用 应用程序可以托管在one or many服务器 A Server has one or many roles for
  • 为什么在 TypeScript 中,接口中可能的数值可以转换为类实现中不可能的数值?

    今天我遇到了一个意想不到的 TypeScript 编译器行为 我想知道这是一个错误还是一个功能 可能这将是最后一个 但我想知道其背后的理由 如果我声明一个接口方法 其参数可以是string number 并创建一个实现该接口的类 那么该类方
  • 从 firebase 获取特定类别的数据

    我想对 Firebase 实时数据库中的数据进行分类 然后按类别选择它们以显示在我的 android 视图的不同部分中 但我不知道从哪里开始 我是 Firebase 的新手 我所知道的就是如何提取数据 推送到 Firebase 数据库并显示
  • 告诉转义的十六进制在字符串中结束的位置[重复]

    这个问题在这里已经有答案了 我想打印 10 Celsiusprintffunction 通常我会这样做 printf 10 xF8Celsius 其中 xF8 是度数符号的 ANSI 代码 问题是编译器获取 x 之后的所有十六进制字符并尝试
  • Android Studio:新项目与新模块

    Android Studio 使用的概念modules 而其他 IDE 例如 Eclipse 则使用projects 然而ASFile菜单可以选择创建一个New Module以及ASAnew Project 如果有的话 这两者之间有什么区别
  • 在 Big Sur 上使用 perlbrew 安装 perl 时出错

    我正在尝试使用 perlbrew 在 macOS 环境中安装 perl 版本 5 33 4 我无法理解为什么它在安装过程中失败 我开始使用安装 perlbrew curl L https install perlbrew pl bash 然
  • MVC4 中表的 Foreach 循环

    我正在使用 C 在 MVC4 中完成我的项目 我的模型中有一个 IEnumerable 列表 我使用以下循环来列出我的观点 table tbody foreach var item in Model tr td Rtn item Mem N
  • 替换单个换行符,保留多个[重复]

    这个问题在这里已经有答案了 我正在解析一个文本文件 并希望删除所有段落内换行符 同时实际上保留形成新段落的双换行符 例如 这是我的第一首诗 n没有意义 n它应该走多远 没有人知道 n n这里是一秒钟 n那并不长 再见 n n 打印出来后 应
  • 如何修复:类文件 com/sun/org/apache/xerces/internal/impl/xs/XMLSchemaValidator 中的未知常量标记 32

    今天早些时候我遇到了以下异常 Unknown constant tag 32 in class file com sun org apache xerces internal impl xs XMLSchemaValidator 我没有做任
  • 有没有办法从堆栈溢出下载所有问题和答案?

    我有兴趣查看网站使用情况 问题类型和堆栈溢出的答案 有没有办法下载全部内容 我考虑过使用 beautiful soup 或类似的网页抓取作为一种选择 但我认为有如此多的专家用户 可以通过 API 轻松获得信息 是的 正如你猜的那样 有一个
  • Quartz.NET 运行作业自行重新安排?

    我完全以编程方式创建了一个 Quartz NET 作业 没有配置文件等 它按计划运行良好 该作业使用 cron 字符串初始化 每 5 分钟运行一次 我想让作业根据环境更改其自身的计划 例如 随着时间的推移会发生错误 因此 cron 应该更改
  • PublishJMS 处理器无法将消息写入 IBM Websphere MQ

    我在通过 PublishJMS 处理器将消息发布到 IBM Websphere MQ 队列时遇到问题 配置PublishJMS处理器和JMS控制器服务 我已经验证MQ连接没有问题 我相信我需要在 PublishJMS 或控制器服务中设置一些
  • 当我选择 UITableViewCell 时,我的视图控制器标签是后面的操作

    我有一个带有表视图的视图控制器 我还有一种方法 当选择表视图的单元格之一时 该方法应该推送到新的视图控制器 新的视图控制器包含一个标签 我希望该标签显示所选单元格内容的全文 目前 当选择单元格时 先前选择的单元格的内容会显示在标签上 这是我
  • 如何在 Haskell 中向 Functor 实例声明添加类约束?

    我定义了以下数据类型 data Probability a PD mass a Ratio Int 现在我想写它是一个实例Functor collect Eq a Num b gt a b gt a b collect al map col