gpt4 book ai didi

types - 如何使用 Raku 类型系统强制执行不变性?

转载 作者:行者123 更新时间:2023-12-03 14:06:38 26 4
gpt4 key购买 nike

我欣赏不可变数据结构的值(value),真的很喜欢 Raku 内置了很多。我特别喜欢编译器/类型检查器会为我强制执行不变性——我可能有休息日或对某些事情粗心大意,但编译器永远不会.
或者至少,我是这么想的。
然而,我很惊讶地看到以下代码在没有从类型检查器中窥视的情况下运行:

my Map $m = Hash.new('key', 'value');
say $m.WHAT # OUTPUT: «(Hash)»
查阅文档后,我看到 MapHash 的父类(因此 Hash.isa('Map') 返回 True 。所以我了解(在机械层面上)如何成功进行类型检查。但我有两个问题:首先为什么继承会这样工作,其次,我能做什么如果我真的希望类型检查器保证我的不可变变量保持这种状态,那么关于它。
关于“为什么”的问题——像这样构建的 map 有什么不同? Raku 的其他不可变类型都不是: Set.isa('SetHash') , Mix.isa('MixHash') , Bag.isa('BagHash') , Blob.isa('Buf') ,和(如果有的话) List.isa('Array')全部返回 False . [ 编辑 :正如 jjmerelo 在下面指出的那样,我颠倒了所有这些。我应该说 SetHash.isa('Set') , MixHash.isa('Mix') , BagHash.isa('Bag')Buf.isa('Blob')全部返回 False .有趣的是, Array.isa('List')返回 True ,这为伊丽莎白·马蒂森 (Elizabeth Mattijsen) 的声明提供了一些支持,即这是历史疏忽 – List s 和 Map s 绝对是比大多数其他不可变类型更基本的数据类型。]
有什么不同 Map s 和 Hash他们有这种行为吗?
关于更实际的问题,我能做些什么来让类型检查器在这里帮助我更多吗?我知道,在这种特定情况下,我可以写一些类似的东西
my Map $m where { .WHAT === Map } = Hash.new('key', 0); # Throws the error I wanted
甚至
subset MapForRealThisTime of Map where { .WHAT === Map }
这些真的是最好的选择吗?他们都觉得有点笨拙( where 块可能有运行时成本?)但也许这是最好的方法?
更一般地说,我真正想要的是一种在严格模式下进行类型检查的方法,可以这么说。如果我显式声明一个变量的类型,我真的希望编译器保证该变量具有那个确切的类型——而不是其他一些恰好将该类型作为父类型的类型。有没有我可以采取的更通用的方法,或者我只是要求 Raku 不会提供的严格程度?

最佳答案

What's different about Maps and Hashes that they have this behavior?


就我个人而言,我认为这是一个历史疏忽,需要在 future 的某个时候修复。

Are those really the best alternatives?


我认为您正在寻找 is在这种情况下的特征:
my %m is Map = a => 42, b => 666;
dd %m; # Map.new((:a(42),:b(666)))
%m<a> = 666; # Cannot change key 'a' in an immutable Map
%m<c> = 666; # Cannot add key 'c' to an immutable Map

am I just asking for a level of strictness that Raku isn't going to provide


恐怕你是。您可以使用 =:= where 中的运算符条款:
subset RealMap of Map where .WHAT =:= Map;
my RealMap $m = Map.new((a => 42)); # works
my RealMap $h = Hash.new((a => 42));
# Type check failed in assignment to $m; expected RealMap but got Hash ({:a(42)})

关于types - 如何使用 Raku 类型系统强制执行不变性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63294853/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com