- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在 haskell 中我可以写一个函数 f where
f :: Set a -> Set a -> Set a
如果我采用 Set Int
类型的两组 s1
和 s2
,然后执行 f s1 s2
它将产生类型为 Set Int
的东西。
但是在 scala 中,我不能这样写,因为 A 是某种固定类型,与长。
val x = Set(3L)
val y = Set(4L)
def foo[A](f: (Set[A], Set [A]) => Set [A]) = {
f(x,y)
}
不过,我真正想要的是 def foo[forall A. A] ...
。我怎么写这个?
编辑 动机是我从一个来源检索数据(x
& y
),以及调用方法他们来自另一个来源。 x
& y
只是一些包含任何东西的集合,但已知是同一类型。
如果我有一些适当的多态函数,我可以只传递 x
&y
,并且交集(或其他)可以正常工作,因为交集不关心集,只是他们被订购了。也许我已经忘记了如何以非 haskell 的方式做到这一点......
最佳答案
在 Scala 和 Haskell 中,f
的类型是相似的(直至同构):
f :: forall a. Set a -> Set a -> Set a
def f[A]: (Set[A], Set[A]) => Set[A]
Scala 中的泛型类型参数与 Haskell 中的类型变量的工作方式完全相同。所以我不确定你为什么说在 Scala 中这是不可能的——它不仅可能而且看起来非常相似。您可以使用任意集合作为参数调用 f
,就像在 Haskell 中那样:
f[Int](Set(1, 2), Set(3, 4))
当您想将一个多态 函数传递给另一个可以使用任意类型的函数时,差异就开始了。在 Haskell 中,它需要更高级别的多态性:
foo :: (forall a. Set a -> Set a -> Set a) -> Whatever
foo f = toWhatever $ f (makeSet [1, 2, 3]) (makeSet [4, 5, 6]) // you get the idea
Scala 在其类型系统中没有与此直接对应的东西。您需要做一个特殊的技巧来编码类型之间所需的关系。首先,定义一个附加特征:
trait PolyFunction2[F[_], G[_], H[_]] {
def apply[A](f: F[A], g: G[A]): H[A]
}
然后你需要扩展这个特性来定义多态函数:
def f = new PolyFunction2[Set, Set, Set] {
def apply[A](f: Set[A], g: Set[A]): Set[A] = f ++ g
}
并且你需要使用这个特性来定义类型参数:
def foo(f: PolyFunction2[Set, Set, Set]): (Set[Int], Set[String]) =
(f(Set(1, 2), Set(3, 4)), f(Set("a"), Set("b")))
scala> foo(f)
res1: (Set[Int], Set[String]) = (Set(1, 2, 3, 4),Set(a, b))
当然,这是一个临时实现,因此您最好使用 Shapeless,因为它更通用。
关于Scala 相当于 'forall a. Set a -> Set a -> Set a',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25627035/
标题和标签应充分解释问题。 最佳答案 Title and tags should explain the question adequately. 呃,不是真的。您使用了标签 existential-
以 Haskell 中简单的恒等函数为例, id :: forall a. a -> a 鉴于 Haskell 据称支持谓语多态性,我应该能够将 id“限制”为类型 (forall a.a -> a)
Ltac checkForall H := let T := type of H in match T with | forall x, ?P x => idtac | _ =
如何在 Coq 中证明 (forall x, P x/\Q x) -> (forall x, P x)?已经尝试了几个小时,但不知道如何分解 Coq 可以消化的东西的前因。 (我是新手,显然:) 最佳
是否可以编写类型的单射函数 hard :: (forall n . Maybe (f n)) -> Maybe (forall n . (f n)) 作为total functional progra
我试图理解使用 forall 量化两个类型变量和使用 forall 量化元组类型的单个类型变量之间的区别。 例如,给定以下类型系列: {-# LANGUAGE RankNTypes #-} {-# L
在证明中,我需要证明“如果 n 不是三的倍数,那么 n+n 也不是三的倍数”。我认为我的证明太长而且不是很优雅。有没有更漂亮的写法?有没有ssreflect? (我确定 ssreflect 中有一个
从我收集到的有关 agda 的零碎信息中,我(显然是错误地)得出的结论是 ∀ {A}相当于 {A : Set} .现在我注意到 flip : ∀ {A B C} -> (A -> B -> C) ->
如果我不想查看列表中的每个元素是否与另一个列表中相同索引的元素正确对应,我可以使用 forall 来执行此操作吗?例如类似的东西 val p=List(2,4,6) val q=List(1,2,3)
我尝试使用 Function 来使用度量来定义递归定义,但收到错误: Error: find_call_occs : Prod 我在底部发布了整个源代码,但我的功能是 Function kripke_
我一直在阅读existential section维基教科书中的内容如下: Firstly, forall really does mean 'for all'. One way of thinkin
从 ghc-8.0 开始,我们有一个非常好的扩展,称为 TypeApplications。这允许我们代替: λ> show (5 :: Int) "5" 这样做: λ> :set -XTypeAppl
我阅读了HaskellWiki关于数据构造函数并考虑以下内容: 2.1 Data constructors as first class values Data constructors are fi
我想证明以下定理: Theorem Frobenius (A: Set) (q: Prop) (p: A -> Prop) : (q \/ forall x : A, p x) -> (foral
我遇到了一个函数无法进行类型检查的情况,除非我在其类型签名的开头显式添加一个 forall。 有问题的功能是: test :: (Typeable a) => a -> a test x |
看来需要明确说forall在数据定义中有参数类型。例如,这 data A = A (forall s. ST s (STUArray s Int Int)) 将工作,而这 data A = A (ST
我对哈姆雷特有一个奇怪的问题。我正在尝试使用 $forall 遍历列表,但我不断收到“不在范围内”错误。我在 Win7 上运行 yesod 0.9.2.2。 除了糟糕的设计,有人知道我哪里出错了吗?删
考虑以下表: object MyTestsFactory { val testCases = Table( ("testName", "input", "output"), ("t
我正在通过阅读“Certified Programming with Dependent Types”一书来学习 Coq,但我在理解问题时遇到了问题 forall句法。 举个例子,让我们考虑一下这种相
可以使用 GADT 来表达 Existentially quantified 类型。 我看到 GADT 更通用 - data-type-extensions ,第 7.4.7 节 什么时候使用存在量化
我是一名优秀的程序员,十分优秀!