6

Haskell で多くの一時変数を作成します。

main = do
    let nums'' = [1..10]
    let nums' = a . bunch . of_ . functions $ nums''
    let nums = another . bunch . of_ . functions $ nums'
    print nums

つまり、次のような関数の長いチェーンを書きたくありません。

let nums = another . bunch . of_ . functions . a . bunch . of_ . functions $ [1..10]

私には読めなくなってしまうので、機能に応じて機能をグループ化しようとしています。nums''その過程で、 andのような醜い一時変数を大量に作成することにnums'なります (もっと意味のある名前を付けることができますが、要点は変わりません...すべての新しい行は新しい変数を意味します)。これは、シャドウされた変数がよりクリーンなコードになる場合です。私は次のようなことをしたいと思います:

let nums = [1..10]
nums = a . bunch . of_ . functions $ nums
nums = another . bunch . of_ . functions $ nums

つまり、上記とまったく同じですが、一時変数はありません。Haskellでこれを行う方法はありますか? たぶん、すべてを「トランザクション」にラップすることができます。

atomically $ do
  (...this code...)
  return nums

このセクションのコードにシャドウ変数が含まれていることを Haskell に知らせるものであり、最終結果のみを気にする必要があります。これは可能ですか?

4

4 に答える 4

14

このスタイルは非常に一般的です:

let nums = another
         . bunch
         . of_
         . functions
         . a
         . bunch
         . of_
         . functions
         $ [1..10]

コードを明確に描写しています。while.は、一時変数名の場所を提供します。

また、変数名をシャドウイングし始めたときに発生する可能性がある危険な問題を回避できます。誤って間違った名前を参照すると、x遅かれ早かれ問題が発生します。

于 2012-05-17T19:43:51.410 に答える
10

これは、私が時々使用する誰も与えていない提案です: 値に名前を付けるよりも、関数に名前を付ける方が好きかもしれません! たとえば、次のように書くかもしれません。

let runningSum = a . bunch . of_ . functions
    weight     = another . bunch . of_ . functions
in weight . runningSum $ [1..10]
于 2012-05-17T21:49:02.280 に答える
6

名前 ( numsnums'nums''、...) はグループ化に関する情報を伝えないため、改行を使用して機能をグループ化し、同じことを伝えることができます。

main =
    let nums = a . bunch . of_ . functions
             . another . bunch . of_ . functions
             $ [1..10]
    in print nums

ただし、これを行う代わりに、サブ計算に情報を伝える名前を付けることをお勧めします。normalizedNumsaverageなど。別の名前を使用しているため、醜いシャドウイングの問題はありません。

于 2012-05-17T20:44:15.943 に答える
6

絶対に必要な場合は可能ですが、慣用的ではありません。代わりに Don または luqui の提案を使用してください。

main = do
    nums <- return [1..10]
    nums <- return $ a . bunch . of_ . functions $ nums
    nums <- return $ another . bunch . of_ . functions $ nums
    print nums

モナドにいない場合は、恒等モナドでいつでも新しい do ブロックを開始できます。

于 2012-05-17T20:25:53.687 に答える