作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
使用 -XOverloadedStrings
时你可以实现IsString
只需要一个函数fromString
.
现在,如果您想使用字符串文字进行模式匹配,您还必须实现 Eq
,这是有道理的:
f :: MyString -> Bool
f "foo" = True
f _ = False
-- equivalent to
f x
| x == fromString "foo" = True
| otherwise = False
但是为什么
IsList
与
-XOverloadedLists
一起使用的类型类要求您实现
toList
?
toList
的用例是模式匹配。
Eq
不足以进行列表模式匹配。
toList
应该在一个不同的类型类中,只有当你想使用列表模式匹配你的类型时才需要,就像
IsString
不需要
Eq
.
fromList . toList = id
必须满足,但对于某些类型,例如,这根本无法保证。一个无序的集合,它不保证元素的顺序被保持。
最佳答案
两个扩展中重载的只是一个符号。两种表示法的区别在于列表可以包含变量
( [x, y]
) 而字符串不能:Haskell 不会像 let x = "apple" in "I like {x} pie")
那样进行变量插值
当我在模式中使用任何一种表示法时,这种差异变得很重要:我希望能够在模式中绑定(bind)变量,例如
f :: MyList Int -> Bool
f [x, y] = x > y
...而,即使我可以使用字符串文字作为模式
f :: MyString -> Bool
f "apple" = True
...那些永远不会绑定(bind)变量
-XOverloadedLists
将完全像
-XOverloadedStrings
那样翻译模式匹配.模式匹配
f [x,y] = x > y
将被翻译为
f z
| z == fromList [x, y] = x > y
但是
fromList [x, y]
不是构造函数模式:对于给定的
z
,
x
可能有几个不同的值和
y
这样
fromList [x, y] == z
(在您的示例中,无序集合
{1, 2}
等于
fromList [1, 2]
但也等于
fromList [2, 1]
- 那么
f {1, 2}
的结果应该是
True
还是
False
?
Mylist a
需要与
[a]
同构,换句话说,一个
toList
需要满足适当的法律。然后我们可以找到唯一的
x, y
这样
z == fromList [x, y]
通过申请
toList
至
z
,所以翻译改为
f z
| toList z == [x, y] = x > y
或者,使用
view pattern (甚至不再需要
Eq
了):
f (toList -> [x,y]) = x > y
所以,最终,你的
IsList
没有
toList
的类不允许重载列表模式,但仍然可以表示您的无序集合
{1, 2}
使用列表符号
[1, 2]
.但是我们会得到
-XOverloadedLists
和
-XOverloadedListPatterns
- 可能不值得麻烦。
关于haskell - 为什么 IsList 需要 toList?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66804720/
使用 -XOverloadedStrings 时你可以实现IsString只需要一个函数fromString . 现在,如果您想使用字符串文字进行模式匹配,您还必须实现 Eq ,这是有道理的: f :
本文整理了Java中org.bukkit.configuration.file.YamlConfiguration.isList()方法的一些代码示例,展示了YamlConfiguration.isL
我习惯了 C# 而不是 JS,所以如果我无知,请让我松懈,但我正在寻找通过 API.ai 发送的列表进行 foreach 循环,我不知道它是否是一个定长数组或列表,或者在 Javascript 中两者
我是一名优秀的程序员,十分优秀!