- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我收到以下代码的错误 - 我怀疑它与 dispatch
函数的类型签名有关,该函数返回 Storable a 类型的
。更新 Vector
dispatch
函数类型签名以仅在类型签名中执行 Int32
和 CChar
的简单方法是什么:
{-# LANGUAGE BangPatterns #-}
import Data.Vector.Storable as SV
import Foreign.C.Types (CChar)
import GHC.Int (Int32)
data AList = I {-# UNPACK #-} !(SV.Vector Int32)
| S {-# UNPACK #-} !(SV.Vector CChar)
dispatch :: (Storable a) => AList -> SV.Vector a
dispatch (I x) = x
dispatch (S x) = x
ghci 7.4.1 错误:
test.hs:11:18:
Couldn't match type `CChar' with `Int32'
Expected type: Vector a
Actual type: Vector Int32
In the expression: x
In an equation for `dispatch': dispatch (I x) = x
Failed, modules loaded: none.
我在假设我的错误诊断是正确的情况下问这个问题。如果我的诊断不正确,我将不胜感激有关如何修复上述错误的指示。
最佳答案
类型签名
dispatch :: (Storable a) => AList -> SV.Vector a
说“给我一个 AList
,我会给你一个 SV.Vector a
用于任何 a
你想要的,只要它是 Storable
的一个实例”。那是不对的!对于任何给定值,您只能提供一个 a
,并且您选择它,而不是调用代码。如果您显式添加量词,问题可能更容易发现:
dispatch :: forall a. (Storable a) => AList -> SV.Vector a
你真正想说的是“给我一个 AList
,我给你一个 SV.Vector a
for some我选择的 a
,但我保证它将是 Storable
的一个实例。为此,我们需要一个存在类型:
data SomeSVVector = forall a. (Storable a) => SomeSVVector (SV.Vector a)
dispatch :: AList -> SomeSVVector
dispatch (I x) = SomeSVVector x
dispatch (S x) = SomeSVVector x
(为此你需要 {-# LANGUAGE ExistentialQuantification #-}
。)
这给 SomeVVector
类型:
SomeVVector :: (Storable a) => SV.Vector a -> SomeVVector
然后您可以使用 case dispatch x of SomeSVVector vec -> ...
从 dispatch
的结果中取出 SV.Vector
.然而,这可能不是那么有用:因为存在性可以包含一个向量,其元素是 Storable
的 any 实例,仅 操作您可以对里面的数据执行 Storable
类提供的数据。如果您想要用户代码可以分析和“分派(dispatch)”类型的东西,您将需要一个带标签的联合 — 这正是您的 AList
类型已经存在的。
如果您确实想走存在主义路线,那么我建议将您自己的类型类定义为 Storable
的子类,其中包含您可能希望对内部值执行的所有操作。至少,您可能希望将 Integral
添加到 SomeSVVector
的约束中。
正如您在评论中提到的,如果您不介意 Int32
的 AList
和 CChar 的
具有不同的类型,您可以使用 GADT:AList
data AList a where
I :: {-# UNPACK #-} !(SV.Vector Int32) -> AList Int32
S :: {-# UNPACK #-} !(SV.Vector CChar) -> AList CChar
dispatch :: AList a -> SV.Vector a
dispatch (I x) = x
dispatch (S x) = x
这里,AList
本质上是 SV.Vector
的一个版本,它只适用于某些元素类型。但是,dispatch
并不是那么有用——在使用 dispatch
将其取出后,没有真正的方法可以“返回”到 AList
>,因为 GADT 模式匹配提供的类型统一仅适用于显式模式匹配;您无法判断 dispatch
的结果是 SV.Vector Int32
还是 SV.Vector CChar
。有点像
dispatch :: (SV.Vector Int32 -> r) -> (SV.Vector CChar -> r) -> AList a -> r
会起作用,但这等同于(并且比)原始标记联合版本上的模式匹配。
我认为没有合理的方法来定义有用的dispatch
;我建议改为在您的原始 AList
定义上使用显式模式匹配。
关于haskell - 为类型匹配定义 Storable 的受限子集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9178308/
我有一个数据类型是 Monoid 的实例所以我可以得到很好的值(value)观组合: data R a = R String (Maybe (String → a)) instance Monoid
目标:我需要在权限非常有限的 AppDomain 中运行一些代码 - 它应该无法访问任何花哨或不安全的东西,除了少数我在别处定义的辅助方法。 我所做的:我正在创建一个具有所需基本权限的沙箱 AppDo
在我的 VPS 中,我不知道为什么,但是当我对另一个用户执行 su 时,我得到的是: root@deb64:~# su john $ 带选项卡的自动完成不起作用,甚至是命令源。示例: root@deb
我正在寻找一种方法,将二进制代码标记为“受限”,而代码是用swift编写的。 我特别要说的是,将这些标志设置到链接器以防止动态库加载: -Wl,-sectcreate,__RESTRICT,__res
这个问题在这里已经有了答案: Access restriction on class due to restriction on required library rt.jar? (15 个答案)
我正在寻找一个基于Web的JavaScript textarea编辑器,该编辑器支持诸如可选字体,文本颜色,段落对齐等标准功能。但是,有一个相当大的约束:格式应始终应用于所有文本,而不是部分文本。文本
我有以下查询: SELECT pro.* FROM tb_AutProposta pro, tb_AutParcelamento par WHERE pro.id = par.id 但是,想要将
我的问题实际上是一个逻辑问题,任务是将列表截断到 Racket 中的给定长度。也就是说,给定一个列表 (A B C),给定长度为 2,我想要一个新列表 (A B)。限制是我们有可用功能的限制列表,我将
我试图将 jQuery UI DatePicker 限制为仅当前年份,到目前为止它在 This Demo 处工作正常。 我使用以下代码来完成这项工作 $("#datepicker").datepick
我在 minikube 中启用了 podsecuritypolicy。默认情况下,它创建了两个 psp - 特权和受限。 NAME PRIV CAPS SELINUX
我使用 Google Cloud Endpoints 定义了一个简单的 API: @Api(name = "realestate", version = "v1") public class Real
我在Tableau中设计可视化,我的数据在Hive/hadoop中,数据量很大, 当我尝试设计可视化时,查询运行非常非常慢,因为每次它尝试从 hadoop 中提取数据。 所以对于任何可视化,简单的拖放
我已经在这个问题上停留了一段时间。我正在尝试访问我使用 HttpClient 和 Tomcat 7 实现的 ContainerServlet。我不断收到错误消息“Restricted(Containe
由于使用了太多的 Websphere Message Broker 实例或类似的东西,我们刚刚用完了 Linux 机器上的信号量。 我和一位同事想知道为什么这甚至是有限的 - 这只是一点内存,对吧?
我正在尝试复制 boost::variant二维矢量转化为array .使用指令 copy(vectorName.begin(), extentName); .首先我得到错误,因为矢量类型是 vari
我的数据库非常受 cpu 限制,我找不到问题的根本原因。我目前有两个应用程序服务器,每个服务器都有一个 Rails api,通过 ruby-pg gem 连接到 PostgreSQL。两个应用程序
我已经开始学习多核编程和开发并行算法。这可以通过在 Java 中使用多线程轻松完成。因此,我创建了两个包含 10 行内容的文本文件,如下所示: This is the first line in fi
Jinja 的 sandbox Zope 2 RestrictedPython 似乎解决了类似的问题。有没有办法对它们进行分层,即在 Jinja 环境中使用 RestrictedPython 策略?用
我在 Azure VNet 上有一个 HDInsight Hadoop 群集(Linux,单独部署)(使用 NSG 限制客户端 IP)。 Azure SQL 防火墙有一个名为“允许访问 Azure 服
这就是我想要做的:我想使用“_”函数以 gettext 兼容的方式为我的 zmi python 脚本启用 i18n 支持。 这是我到目前为止所做的。在我的 Zope 产品的模块中,我运行: impor
我是一名优秀的程序员,十分优秀!