2016-08-22 16 views
1

引数の順序は、Array.getDict.getの順番になっていますか?ほとんどのマップ/フィルタ関数の順序は意味があります。関数はコレクション(またはより一般的にはモナド)の前にあります。`get`関数への引数の順序の根拠

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

これにより、コレクションを渡す前に、小さなものからより高い機能を構成することが容易になります。

なぜ、インデックス/キーはget関数のコレクションの前に来るのですか?

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

高機能を構成するのが難しくなるようです。引数が逆転した場合、1は書くことができます:

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

['flip'](http://package.elm-lang.org/packages/elm-lang/core/4.0.5/Basics#flip)を使って、lambda:' Listを削除することができます。 map(flip Dict.get myObjects)ids' –

+0

私はこの提案に感謝しますが、私はこれを回避する方法を尋ねていませんでした。これは非常に簡単です。私はFPにはあまり経験がないので、議論命令の背後にある推論を知りたいと思います。私は、ライブラリの設計が許すいくつかの利点があるかどうかを知りたいと思います。 – Eric

+1

私は、Haskellの['Data.Map.lookup'](http://hackage.haskell.org/package/containers-0.5.7.1/docs/Data-Map-Strict.html##)のように設計されていると思いますv:lookup)関数であり、偶然、Haskell wikiのパラメータ順序の[bad examples](https://wiki.haskell.org/Parameter_order#Bad_examples)セクションの下にリストされています。 –

答えて

3

List.map (Dict.get myObjects) idsは機能的な構成ではありません。

組成物はあなたが
f : X -> Y
g : Y -> Zを持っている場合、上記のような機能を構成するとき
h : X -> Z

は今、私たちは一つだけ多くを必要とするためにそれらを必要とするように、そして、あなたがそれら
h = f >> gを構成ですパラメータ。 APIを定義するとき

だから、質問は次のとおりです。
「誰かが部分的にそれを構成することができるように、この機能を評価し、彼らははおそらく渡ししたいと思う最後のパラメータは何ですか?」
getStuff >> mungeIntoDict >> (Dict.get id)
または
getStuff >> getImportantId >> (Dict.get myDict) :つまり

は、のようなコードを見て、我々は可能性が高いですか?

その答えは「それは依存する」です。 APIデザイナーは最高の推測をしましたが、それが当てはまらない場合はflipとなりました。