“get”函数参数顺序的基本原理

时间:2016-08-22 18:24:19

标签: elm

为什么参数的排序顺序与Array.getDict.get相同?大多数map / filter函数中的顺序是有意义的:函数在集合之前(或monad,更一般地说)。

MyCollection.map : (a -> b) -> MyCollection a -> MyCollection b

这使得在传递集合之前更容易从较小的函数中组合更高的函数。

然而,为什么索引/键在get函数的集合之前出现?

Dict.get : comparable -> Dict comparable v -> Maybe v

这似乎使组成更高级别的功能变得更加困难。如果争论被颠倒了,可以写下:

ids : List Int
myObjects : Dict Int a

selectObjects = List.map (Dict.get myObjects) ids

但相反,我能想出的最佳方法是:

ids : List Int
myObjects : Dict Int a

selectObjects = List.map (\id -> (Dict.get id myObjects)) ids

我错过了什么吗? Array.getDict.get和类似的论点顺序是什么原因?

1 个答案:

答案 0 :(得分:3)

List.map (Dict.get myObjects) ids不是功能组合。

组成就在你的时候 f : X -> Y
g : Y -> Z然后你撰写他们 h = f >> g以便 h : X -> Z

现在,在编写上述函数时,我们需要它们只需要一个参数。

因此,在定义API时,问题是:
“当有人对此功能进行部分评估以便可以编写时,他们可能希望传递的最后一个参数是什么?”

换句话说,我们是否更有可能看到如下代码:
getStuff >> mungeIntoDict >> (Dict.get id)

getStuff >> getImportantId >> (Dict.get myDict)

答案就是“它取决于”。 API设计师采用了他们最好的猜测,当它不适合我们时我们有flip