2016-08-31 13 views
0

のため、私はここに高階関数で、関数の実行

routesはタプルのリストであり、それは問題である。ここ

routes = [... 
      ("graph-fb", seeOther redirectUrlGraphEmail $ toResponse ""), 
      ("post-fb", seeOther redirectUrlGraphPost $ toResponse ""), 
      ...] 

が含まれてい

(map (\ (a, b) -> dir a b) $ routes 

機能を持っている:ときに私この関数を呼び出して各タプルにdirを適用します。この関数はに最初にb、返される関数はseeOther redirectUrlGraphEmailまたはseeOther redirectUrlGraphEmail $ toResponse ""になります。

+3

なぜ重要ですか? 'map'の型からだけでは、' dir'は何の順序で引数を与えられているかによって動作が異なります。これは単なる修辞的な質問ではありません。私はあなたがなぜそれが重要かと言う理由を言うならば、私たちがあなたのために助けることができるハスケルの混乱を明らかにするでしょう。 –

+0

'routes'は関数ではありません。それはリストです。 – dfeuer

+0

ありがとう@dfeuerに言及してください。私はすでにこの問題を修正しました。 –

答えて

2

タプル項目は、graph-fbためのあなたの例に

a == "graph-fb" 
b == seeOther redirectUrlGraphEmail $ toResponse "" 

最初の関数呼び出しがtoResponse ""あろう解決することを意味し、それは2番目のパラメータとしてseeOtherに供給される,によって分離されています。その結果、マッピング機能内にラベルbが表示されます。

+0

私はあなたが言ったことを理解していますが、 'see 'を' redirectUrlGraphEmail'を最初に呼び出すようにする '$'がhaskellの中で最も低い優先順位を持っていませんか? –

+0

'$'は他の中置演算子と比較して優先順位が最も低くなります。カンマの右側のビットは、単一の中置演算子しか含んでいないので、マッピング関数では "束ねられ"、 "b"というラベルが付けられます。 –

0

このコードからはわかりません。コンパイラの様々な劇的な方法でプログラムを再構成する自由を無視しても、Haskell評価への通常のアプローチは怠惰であり、要求駆動、case-駆動、および(最終的に)I/O駆動と考えることができます。実際に結果を検査する者は、評価の順序を決定する。

関連する問題