为啥 foldl 签名是管道而不是 SML 中的元组类型?

Posted

技术标签:

【中文标题】为啥 foldl 签名是管道而不是 SML 中的元组类型?【英文标题】:Why is foldl signature is a pipeline instead of a tuple like type in SML?为什么 foldl 签名是管道而不是 SML 中的元组类型? 【发布时间】:2022-01-08 08:07:42 【问题描述】:

我不明白为什么foldl的签名是这样的。

Standard ML of New Jersey v110.79 [built: Tue Aug  8 23:21:20 2017]
- foldl;
val it = fn : ('a * 'b -> 'b) -> 'b -> 'a list -> 'b

特别是,箭头 -> 应该是星号 *,如下所示:

val it = fn : ('a * 'b -> 'b) * 'b * 'a list -> 'b

而原因是因为foldl 采用了以下内容:

    函数('a * 'b -> 'b)比较&返回两个字符串之一;假设acc 是'b,因此,返回acc acc & 'a list 进行比较。 最后,返回基数'b,即acc

【问题讨论】:

【参考方案1】:

* 需要它是一个元组,这需要提供元组的所有组件...-> 需要currying,它允许partial application。两者都是 2 种不同的语义。

另外,你写的很有趣 ...foldl takes a function that compares two strings....

foldl 是通用的并且非常多态,那么为什么它只适用于string。一个特定的function application 可以处理string 数据,但不能处理function definition 本身。

【讨论】:

这里的string 只是一个使用示例,但无论如何感谢您的回答。

以上是关于为啥 foldl 签名是管道而不是 SML 中的元组类型?的主要内容,如果未能解决你的问题,请参考以下文章

如何比较和搜索列表中的元素与列表 SML 中的元组

SML/NJ - 使用 foldr 的一种线长函数

为啥“不”关心 SML 中的“List.exists”输入?

为啥在 Racket 中以一种奇怪的方式定义 foldl?

给定 SML 中的变量列表,生成所有真值赋值的列表?

为啥使用管道在 IPC 中使用 write() 而不是 print() 打印输出两次?