具有刚性变量的数组

2023-12-15

好吧,我正在做一个问题,其中我使用的函数有一个刚性变量。我想到了使用数组来解决这个问题。所以我想到使用与我创建的函数具有相同刚性变量的数组,但我不知道如何使用刚性变量创建数组。 我尝试了以下操作但没有效果:

rearrange ::  [Int] -> [a] -> [a]

rearrange l la = elems (f 1 posarr)    
  where
    b = length l
    listarr :: Array Int Int
    listarr = listArray (1,b) l
    arra :: Array Int  c
    arra = listArray (1,b) la
    posarr :: Array Int  c
    posarr = listArray (1,b) la
    f i posarr
      | (b < i) = posarr
      | otherwise = f (i+1) (posarr // [(listarr!i,arra!i)] )

我得到的错误是刚性变量。 可能的解决办法是什么?请给出如何使用刚性变量创建数组的想法,例如我使用的以下函数中的 a


您遇到了麻烦,因为您写出的“内部”类型签名并不完全符合它们看起来的含义。特别是,您的使用c彼此不对应而不是a在顶部签名,他们必须。 Haskell 抱怨这些“严格定义”的类型变量,尽管是变量,但不能相同,但因为它们基于“严格”的选择a是……他们必须!

您可以使用名为的扩展使 GHC (但不是一般的 Haskell)按照您想要的方式运行{-# LANGUAGE ScopedTypeVariables #-}你的代码变成的地方

{-# LANGUAGE ScopedTypeVariables #-}

rearrange :: forall a . [Int] -> [a] -> [a]
rearrange l la = elems (f 1 posarr)
  where
    b = length l
    listarr :: Array Int Int
    listarr = listArray (1, b) l
    arra :: Array Int a
    arra = listArray (1,b) la
    posarr :: Array Int a
    posarr listArray (1,b) la
    f i posarr
      | (b < i) = posarr
      | otherwise = f (i+1) (posarr // [(listarr!i,arra!i)])

请注意,我所做的只是添加显式的forall并改变了一些c变量到a. What ScopedTypeVariables让你做的是使用引入类型变量范围forall代码中的任何类型签名都明确缩进在这样的下面forall'd 签名可以重用其中引入的类型变量名称forall并使它们完全对应。

在检查 Haskell 如何解释没有扩展名的类型签名时,这可能更有意义。特别是,有一个隐含的forall before every类型签名

                                  -- is actually
foo :: [a] -> [a] -> [a]          foo :: forall a. [a] -> [a] -> [a]
foo xs ys = it where              foo xs ys = it where
  it :: [a]                         it :: forall a. [a]
  it = xs ++ ys                     it = xs ++ ys

这迫使a每个类型签名中的变量都是不同的,因此这段代码无法编译,因为它仅在这两个a是相同的。和ScopedTypeVariables we have

foo :: forall a . [a] -> [a] -> [a]
foo xs ys = it where
  it :: [a]
  it = xs ++ ys

内部签名的位置a范围的含义完全相同a就像外部签名一样。

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

具有刚性变量的数组 的相关文章

  • Java 从 SQL 数组获取 ResultSet 失败

    我试图从数据库中检索电子邮件地址 但没有成功 我的代码如下 Main System out println PortfolioData getEmails 58 So Far Returning null 投资组合数据 public sta
  • 派生类型数组:选择条目

    目前在我的代码中我有一个二维数组 integer allocatable elements 并定义一些常量 integer parameter TYP 1 integer parameter WIDTH 2 integer paramete
  • 在 T-SQL 中解析 JSON 数组

    在我们的 SQL Server 表中 我们有一个存储有字符串数组的 json 对象 我想以编程方式将该字符串拆分为几列 但是 我似乎无法让它发挥作用 或者即使有可能 是否可以在WITH子句中创建多个列 或者在select语句中创建多个列是更
  • 没有找到合适的写入方法

    我正在尝试将先前创建的数组写入文件 这是我遇到的错误 我不知道如何修复它 Zoo java 341 error no suitable method found for write Animals outputWriter write an
  • Java - 使用数组中的值的replace()方法正在更改数组值?

    我正在做类似的事情 public static String list a b c d It gives me a NullPointeException if I didn t use static public String encry
  • 用埃拉托斯特尼筛法寻找素数(原文:有更好的方法来准备这个数组吗?)

    Note 下面的版本 2 使用埃拉托斯特尼筛法 有几个答案对我最初提出的问题有所帮助 我选择了埃拉托斯特尼筛法 实施了它 并适当地更改了问题标题和标签 感谢所有提供帮助的人 介绍 我编写了这个奇特的小方法 它生成一个包含小于指定上限的素数的
  • 根据javascript中对象数组中的id替换特定对象

    我有一系列像这样的对象 var books id 1 name Name of the wind year 2015 rating 4 5 author 2 现在我有一个函数 editBooks 它要求用户提供 id 并用用户给出的值替换具
  • 字符串插值搜索

    对于那些不熟悉插值搜索的人来说 这是一种在排序数组中搜索值的方法 可能比二分搜索更快 您查看第一个和最后一个元素 并 假设数组的内容均匀分布 线性插值以预测位置 例如 我们有一个长度为 100 的数组 其中 array 0 0 和 arra
  • 为什么 exceptT 没有 MonadMask 实例?

    爱德华 克梅特例外情况图书馆不提供单子掩码 https www stackage org haddock lts 7 18 exceptions 0 8 3 Control Monad Catch html t MonadMask实例为Ex
  • 使用无效数据调用函数 FieldValue.arrayUnion()。 FieldValue.serverTimestamp() 只能与 update() 和 set() 一起使用

    addDeposit account deposit let depositsDoc this db collection accounts doc account id collection deposits doc deposits r
  • PHP:将字符串分成 8 个块,我该怎么做?

    我基本上有二进制 假设它的长度是300 我如何将它分割 就像使用爆炸一样 成 8 位块 我查看了 chunk split 但它似乎只有一个 end 参数 而不是将其放入数组的选项 或者它可以插入数组吗 末尾 8 位数字可以低于 8 如果有人
  • array_udiff_assoc() 和 array_diff_uassoc() 有什么区别?

    有什么区别array udiff assoc and array diff uassoc For array udiff assoc 我有这个代码 function myfunction v1 v2 if v1 v2 return 0 re
  • 是否有一种算法可以在线性时间内计算数组反转?

    我知道有多少倒转 en wikipedia org wiki Inversion 28discrete mathematics 29 in an n 元素数组可以在 O n log n 操作使用增强型归并排序 http www geeksf
  • Haskell 排列库函数 - 请澄清一下?

    这是代码permutationsHaskell 中的函数Data List module permutations a gt a permutations xs0 xs0 perms xs0 where perms perms t ts i
  • Firestore 更新后仅获取文档一次

    我有一个 tableView 它从 Firestore 集合中获取所有文档 并且我只想在用户刷新 tableView 后将最后一个文档添加到 Firestore 时获取一次 然后我想删除侦听器 以便当用户刷新 tableView 时仅获取文
  • 调整巨大数组的大小

    我正在我的应用程序中处理巨大的数组 需要调整它们的大小 假设您有一个 2Gb 的阵列 并且想要将其大小调整为 3Gb 有没有办法在暂时不需要 5Gb 的情况下调整它的大小 例如 给定一个 1Gb 堆 使用 Xmx1G flag public
  • 为什么解析器组合器“seq”用“bind”和“return”定义?

    我正在读这个article http eprints nottingham ac uk 237 1 monparsing pdf关于解析器组合器并且不理解以下内容 他们说使用seq 见下文 导致解析器将嵌套元组作为结果 操作起来很混乱 se
  • 如何计算伽罗瓦域上的numpy数组?

    我想在伽罗华域 GF4 上使用 numpy 数组 所以 我将 GF4 类设置为数组元素 它适用于数组 整数计算 但不适用于数组 数组计算 import numpy class GF4 object class for galois fiel
  • 标准转换:数组到指针的转换

    这是ISO的观点 标准转换 数组到指针的转换 4 2 1 数组 类型的左值或右值 N T 或 未知边界的数组 T 可以转换为右值 类型为 指向 T 的指针 结果是 指向第一个元素的指针 数组 如果可能的话 任何人都可以用一个示例程序来解释这
  • Fortran 子例程返回错误值

    嘿 我正在开发一个 Fortran 程序 遇到了一个奇怪的问题 当我尝试在调用特定子例程之前直接输出数组的某些值时 我得到了正确的值 然后 我尝试在启动子例程时输出同一数组的一些值 它们都是 0 我最终在子例程之后输出数组的值 并且这些值回

随机推荐