为什么参数的排序顺序与Array.get
和Dict.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.get
,Dict.get
和类似的论点顺序是什么原因?
答案 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
。