其他语言中的错误抽象示例

2020-05-20 05:19:01

你有没有其他语言或语言特性的库的例子,它们真的应该实现一个众所周知的概念(Monoid、Monad、Alternative等等),但它们没有实现,因为它们(可能)不知道这个概念?例如违反法律、缺少函数、过于复杂的函数类型等。

我遇到过很多这样的例子,他们总是折磨我。但无论如何,我现在什么都想不起来了。

级别1,因为即使它们有一个等同于PURE的函数,它的行为也不太像PURSE。相反,它们的等价物mx>;>;=f检查f是否返回Promise类型的值,如果不是,它的行为类似于mx>;>;=pure。f;反之亦然,如果你试图用他们的纯洁来许下诺言。因此,不可能有Promise(Promise A)类型的计算,它将被解释为Promise a。

第2级类似地,人们相当频繁地在TypeScript中使用x|null作为可选类型。TypeScript可以执行严格的NULL检查,以确保您可以处理NULL,这将使您有90%的时间获得正确的可能类型。但是,无法编码在某些情况下出现的“可能”(可能是X)。

第二层谢谢,这正是我要找的。这实际上让我想起了另一个破损的Monad实例:Java是可选的。

Java有时将NULL视为Optional.Empty,有时将其视为NullPointerException,这违反了各种法律。

级别2我发现更糟糕的是,很多承诺都是这样运作的:

如果foo有自由变量并且表达式发生变异,则结果不是确定性的。而且你还需要像Promises这样的东西,都是取消的!

在重构时,这是相当糟糕的。在Java中,我通常只使用一个包装类,它将承诺包装在回调中,直到实际运行。

1级Python有一个用于折叠+运算符的SUM函数:SUM([1,2,3,4])==10。您甚至可以为其提供默认值0以外的起始值,以便将其与数字以外的对象一起使用:SUM([[1,2],[3,4]],[])==[1,2,3,4]。由于+是可重载的,因此可以将其用作任意么半群…的mconat操作。除了…。您不能在字符串上使用它。为什么?因为圭多是这么说的,这就是原因。SUM([";one";,";Two";,";Three";,";Four";],";";)引发TypeError:sum()Can';t SUM字符串[改用';';.join(Seq)]。

级别2如果SUM对字符串有效,那么将会有多种连接字符串的方式,这在Python禅宗看来是不可接受的。

级别1可能会引起争议,但在大多数语言中,几乎每个变量都使用null反模式,该反模式可以使用“可能的单体”实现,顺便说一句,当您有可选值时,这将使其显式。另外,解析器,它们很可能是应用程序。

第二级,我认为人们低估了符号和哈斯克尔的类型系统让“可能”发挥多大作用。

例如,即使您实际上修复了Java的可选,以便它在语法上有意义,尝试使用它仍然是地狱般的事情,因为函数不能优雅地组合。

在没有良好的函数组合支持的语言中,单体、函数器和应用程序都非常糟糕,因为这些接口都要求轻量级的可组合闭包符合人体工程学。

如果没有这一点,做正确的事情的摩擦会变得如此之高,以至于它不再成为明智的选择。

1级Python生成器。我原以为它们是懒惰的列表或美化的延续,但是Python开发人员也希望它们具有线性-所以您只能使用它们一次。尽管如此,它们不会操作类似MonadFail的操作、带有失败状态,也不会抛出异常,而是会自动变异为一个空生成器,因此如果有人重用引用,您的数据就会静悄悄地消失。它将其他功能中的纯遍历改变为突变。

从Python2到Python3的主要变化之一是,许多函数从返回列表切换到返回生成器。我们有一个纯&34;函数,它关闭在一个列表上,在第一次被调用后神秘地开始给出不同的结果,因为上游的某个东西无辜地调用了map。

级别1年前,我在一个项目中工作,我必须部署一个数据科学管道,我们选择了Python项目Airflow来完成这项任务。

Airflow是与Web应用程序一起使用的工作流管理器,用于可视化进度、成功和失败,并发出某些命令,如重新运行作业或取消作业。

Airflow利用DAG数据结构来组织工作流,工作效果很好,但是当您想要在新的DAG中运行或包装现有的DAG时,他们提供了子DAG的概念,不幸的是,子DAG的行为与DAG不同,并且有各种相关的错误。

换句话说,子DAG是事后才想到的,这让我很恼火(尽管我已经多年没有用过气流了,但我仍然很恼火),因为如果他们一开始就认为他们的DAG结构是一个么半群,或者至少是一个可以由图形或树叶组成的图形,那么子DAG就会是一个一流的概念。这句话的意思是,如果他们一开始就认为他们的DAG结构是一个么半群,或者至少是一个可以由图形或树叶组成的图形,那么子DAG就会是一个一流的概念。换句话说,他们甚至创造了一个子DAG的概念,这让我很恼火:它根本不应该存在。

是啊,雷迪斯也做过类似的事情。它们有主哈希表,然后您就可以有子哈希表(使用不同的API!)。在那里面,但是..。就是这样。没有子子哈希表。

级别1在榆树生态系统中有很多东西都是单调的,但是在榆树中没有办法对这类东西进行抽象,所以必须为每种类型重新实现有用的组合符。

2级,你也不能对此发表任何言论。单音节是不好的语言。

另一方面,jQuery是DOM镜头的一个非常好的实现。

级别1期望的(任一)和可选的(可能)不是单体。SY Brand甚至创建了自己的版本来解决这个问题(我猜是通过使用和_TGen组合器)。

有一个单一的尝试方案,它试图模拟Haskell的DO符号来表示预期(如果我没记错的话)。但它很笨重,不像哈斯克尔那样。

它们可以使用统一的类似do-notation的语法来完成,该语法也适用于前面的所有要点。但事实并非如此,C++在语法和复杂性方面都在增长,并忽略了这一明显的可能性。我猜类似Do的符号和单体将在一段时间后进入C++,但为时已晚。

C++有更多来自FP的损坏的东西,但是告诉我C++中还有什么东西没有损坏。

第2级流行的文化是拒绝任何哪怕是一点点性能损失的特性。可以理解,但是很可悲。