- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
最近工作中出现了关于 Sets 的讨论,Sets 在 Scala 中支持 zip
方法以及这如何导致错误,例如
scala> val words = Set("one", "two", "three")
scala> words zip (words map (_.length))
res1: Set[(java.lang.String, Int)] = Set((one,3), (two,5))
我认为很明显 Set
不应该支持 zip
操作,因为元素没有排序。然而,有人认为问题在于 Set
并不是真正的仿函数,并且不应该有 map
方法。当然,映射一个集合可能会给自己带来麻烦。现在切换到 Haskell,
data AlwaysEqual a = Wrap { unWrap :: a }
instance Eq (AlwaysEqual a) where
_ == _ = True
instance Ord (AlwaysEqual a) where
compare _ _ = EQ
现在在 ghci
ghci> import Data.Set as Set
ghci> let nums = Set.fromList [1, 2, 3]
ghci> Set.map unWrap $ Set.map Wrap $ nums
fromList [3]
ghci> Set.map (unWrap . Wrap) nums
fromList [1, 2, 3]
因此Set
无法满足仿函数定律
fmap f . fmap g = fmap (f . g)
可以说,这不是 Set
上的 map
操作失败,而是 Eq
实例失败我们定义,因为它不遵守替换律,即对于 A 和 B 上的两个 Eq
实例以及映射 f : A -> B
then
if x == y (on A) then f x == f y (on B)
这不适用于 AlwaysEqual
(例如,考虑 f = unWrap
)。
对于我们应该尊重的 Eq
类型来说,替换定律是一个合理的定律吗?当然,我们的 AlwaysEqual
类型尊重其他平等法则(对称性、传递性和自反性都得到满足),因此替换是我们唯一可能遇到麻烦的地方。
对我来说,替换似乎是 Eq
类非常理想的属性。另一方面,一些关于recent Reddit discussion的评论包括
"Substitution seems stronger than necessary, and is basically quotienting the type, putting requirements on every function using the type."
-- godofpumpkins
"I also really don't want substitution/congruence since there are many legitimate uses for values which we want to equate but are somehow distinguishable."
-- sclv
"Substitution only holds for structural equality, but nothing insists
Eq
is structural."-- edwardkmett
这三个在 Haskell 社区中都是众所周知的,所以我会犹豫是否要反对它们并坚持对我的 Eq
类型进行替代!
反对 Set
作为 Functor
的另一个论点 - 人们广泛认为,作为 Functor
允许您转换 a 的“元素” “收藏”的同时保留了形状。例如,Haskell wiki 上的这段引用(请注意,Traversable
是 Functor
的泛化)
"Where
Foldable
gives you the ability to go through the structure processing the elements but throwing away the shape,Traversable
allows you to do that whilst preserving the shape and, e.g., putting new values in.""
Traversable
is about preserving the structure exactly as-is."
在现实世界的 Haskell 中
"...[A] functor must preserve shape. The structure of a collection should not be affected by a functor; only the values that it contains should change."
显然,Set
的任何仿函数实例都有可能通过减少集合中元素的数量来更改形状。
但似乎 Set
确实应该是仿函数(暂时忽略 Ord
要求 - 我认为这是我们工作愿望强加的人为限制高效地使用集合,并不是任何集合的绝对要求。例如,函数集合是一个完全明智的考虑因素。无论如何,Oleg has shown 如何为 Set 编写高效的 Functor 和 Monad 实例
不需要 Ord
约束)。它们有太多好的用途(对于不存在的 Monad
实例也是如此)。
有人能清理这个烂摊子吗? Set
应该是 Functor
吗?如果是这样,那么对于违反仿函数定律的可能性,人们会采取什么措施呢? Eq
的法则应该是什么?它们如何与 Functor
以及特别是 Set
实例的法则交互?
最佳答案
Another argument against
Set
being aFunctor
- it is widely accepted that being aFunctor
allows you to transform the "elements" of a "collection" while preserving the shape. [...] Clearly, any functor instance for Set has the possibility to change the shape, by reducing the number of elements in the set.
恐怕这是一种以“形状”类比作为定义条件的情况,而事实并非如此。从数学上来说,有幂集仿函数这样的东西。 From Wikipedia :
Power sets: The power set functor P : Set → Set maps each set to its power set and each function f : X → Y to the map which sends U ⊆ X to its image f(U) ⊆ Y.
函数 P(f)(幂集仿函数中的 fmap f
)不保留其参数集的大小,但这仍然是一个仿函数。
如果你想要一个考虑不周的直观类比,我们可以这样说:在像列表这样的结构中,每个元素“关心”它与其他元素的关系,如果错误仿函数这样做,就会“冒犯”打破这种关系。但集合是一种极限情况:一种结构,其元素彼此无关,因此你几乎无法“冒犯”它们;唯一的问题是,假仿函数是否将包含该元素的集合映射到不包含其“声音”的结果。
(好吧,我现在就闭嘴……)
<小时/>编辑:当我在答案顶部引用您时,我截断了以下内容:
For example, this quote on the Haskell wiki (note that
Traversable
is a generalization ofFunctor
)"Where
Foldable
gives you the ability to go through the structure processing the elements but throwing away the shape,Traversable
allows you to do that whilst preserving the shape and, e.g., putting new values in.""
Traversable
is about preserving the structure exactly as-is."我要说的是
Traversable
是一种专门Functor
,而不是它的“概括”。关于任何Traversable
的关键事实之一(或者,实际上,关于Foldable
,Traversable
扩展)是它要求任何结构的元素都具有线性顺序 - 您可以将任何Traversable
转换为线性顺序。放入其元素列表中(使用Foldable.toList
)。关于
Traversable
的另一个不太明显的事实是存在以下函数(改编自 Gibbons & Oliveira, "The Essence of the Iterator Pattern" ):-- | A "shape" is a Traversable structure with "no content,"
-- i.e., () at all locations.
type Shape t = t ()
-- | "Contents" without a shape are lists of elements.
type Contents a = [a]
shape :: Traversable t => t a -> Shape t
shape = fmap (const ())
contents :: Traversable t => t a -> Contents a
contents = Foldable.toList
-- | This function reconstructs any Traversable from its Shape and
-- Contents. Law:
--
-- > reassemble (shape xs) (contents xs) == Just xs
--
-- See Gibbons & Oliveira for implementation. Or do it as an exercise.
-- Hint: use the State monad...
--
reassemble :: Traversable t => Shape t -> Contents a -> Maybe (t a)一个
Traversable
集合的实例将违反拟议的法律,因为所有非空集合都具有相同的Shape
— 其Contents
的集合是[()]
。由此应该很容易证明,每当您尝试reassemble
一个集合,您只能得到空集合或单例返回。教训?
Traversable
“保持形状”的含义比Functor
更具体、更强烈。确实如此。
关于scala - 集合、仿函数和方程混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19177125/
我真的很困惑。我已经尝试使用带有 tomcat 的 Jax-rs 并使用所有注释,我能够使用 url 调用我的服务。因此,如果没有 Jax-rs,我可以简单地拥有一个 servlet 并调用我的服务。
是否有任何工具/商业混淆器可以混淆 WPF 控件中的 BAML 资源? 如果没有,就 IP 保护而言,这是一段艰难的时期,因为黑客可以通过使用 BAML 到 XAML 转换器轻松查看 BAML 资源。
嘿大家。我在尝试使用 COBOL 在 zOS 环境中解决的编码项目中遇到了一些麻烦。我需要读入一个文件并将它们放入索引表中(我知道将少于 90 条记录)。 让我感到困扰的是,我们受到项目参数的约束,以
我试图按照这个例子来理解 join() 方法: class PrintDemo { public void printCount() { try { for(int
当我编译我正在编写的代码,然后在 JD Gui 中查看时,方法显示带有如下标题: public void growSurface(Random paramRandom, int paramInt1,
我正在为重新分发准备 Android 库,它的代码必须进行混淆处理。我已经阅读了有关此主题的一些内容,并且决定使用 Android Library Project。它将作为 jar 分发(自动在/bi
两个混淆相关的问题: 1) 是否有任何工具可以将 F# 从 MSIL 目标形式反汇编回其源形式或接近它的形式?这不是通过默默无闻来实现安全性的尝试,但我想保护某些源代码免遭“盗窃”。 2) 我简要地查
谁能向我解释为什么 simulatedCase <- rbinom(100,1,0.5) simDf <- data.frame(CASE = simulatedCase) posterior_m0
我一直无法找到关于使用 AppDomains 时发生的事情的非常清楚的描述,所以希望有人能够启发我。我有一个简单的测试程序(基本上是扯掉了 MSDN example ): using System;
假设我有 2 个分支topic和 master如果我在 topic分支,然后运行 git rebase master它是 rebase master 还是 rebase 主题分支? 做 git r
我有一个类(class): public class LockTest { public void LockThis() { lock (this)
我正在尝试最小化/混淆我的 Angular 代码,但遇到了问题。我在这里阅读“缩小说明”http://docs.angularjs.org/tutorial/step_05但我定义我的 Control
我遇到了一些困惑的操作。 var a = 0.1; var b = 0.2; var c = 0.3; console.log(a); // 0.1 console.log(b); // 0.2 co
感谢您查看我的帖子 - 我正在尝试弄清楚如何在单击链接时关闭此下拉菜单,但我的 JavaScript 技能非常缺乏,而且代码似乎很困惑。这是 HTML:
混淆、哈希和加密之间有什么区别? 这是我的理解: 哈希是一种单向算法;无法逆转 混淆与加密类似,但不需要任何“ secret ”即可理解(ROT13 就是一个例子) 加密是可逆的,但需要“ secre
我有以下代码 my $content = $response->content; $content =~ /username=([\s\S]+?)&/; my $username = $1; prin
我在 .NET 中发现了一些与我预期的有点不同的东西。我粘贴的代码没有意义,但它是我拥有的一个复杂得多的函数的浓缩版。我实际上是在获取匿名类型信息作为参数(尚未创建匿名类型的实例),我需要创建该类型的
我正在努力解决 JavaFX 应用程序的混淆问题。使用此项目作为基础: https://github.com/openjfx/samples/tree/master/IDE/IntelliJ/Non-
是否可以制作一个与此类似的 CSV 阅读器 while((line = reader.readLine()) != null){ String[] values = line.
公共(public)类测试2 { 公共(public)静态无效主(字符串[]参数){ System.out.println("3 + 6"); System.out.println(3
我是一名优秀的程序员,十分优秀!