これはHaskellメイン関数の有効なデザインパターンですか?


8

いくつかのHaskellアプリケーションを開発した後、純粋でないコードと完全なコードから、不純なコードと失敗する可能性のある(部分)関数を厳密に分離していることに気付きました。これらの取り組みにより、アプリケーションに関連するメンテナンスコストが大幅に削減されました。私は、時間の経過とともに、この分離を実施するために同じ高レベルの構造に依存していることに気づきました。main

一般的に、私mainは次のような構造になります。

import System.Environment

data ProgramParameters = P ()
data ComputationResult = I ()

main :: IO ()
main = getArgs                           -- Collect arguments
   >>= andOrGetUserInput                 -- Collect user input
   >>= impureOrFailableComputations      -- Possible non-recoverable error(s)
   >>= either                            -- "Branch"
         putStrLn                        -- Print Any Failure(s)
         pureNotFailableComputations     -- Finish the work

andOrGetUserInput :: [String] -> IO ProgramParameters
andOrGetUserInput = undefined

impureOrFailableComputations :: ProgramParameters -> IO (Either String ComputationResult)
impureOrFailableComputations = undefined -- a composition of partial functions
                                         -- made total by catching exceptions & input errors
                                         -- in the short-circuiting ErrorT/EitherT monad

pureNotFailableComputations :: ComputationResult -> IO ()
pureNotFailableComputations = undefined  -- a composition of total functions

目標は、モナド内の部分的な計算を合体させ、完全なモナド計算を作成することです。

これはコードベースのパターンになっています。これがデザインパターンであるアンチパターンであるかについてフィードバックをお願いします

  • これは部分的な計算を分離してキャッチする慣用的な方法ですか?

  • この高レベルの分離には注目すべき欠点はありますか?

  • より良い抽象化手法はありますか?

回答:


7

この設計では、いくつかの重要な仮定が行われます。

  • ユーザーの入力は、純粋または不純な計算の結果に依存しません。

  • 純粋でない計算は、純粋な計算の結果に依存しません。

  • プログラムロジックはループしません。一度だけ実行されます。

あなたの構造についての他のコメントは、純粋な計算と不純な計算を分離する必要がないということです。Haskellの型システムはすでにそれを行っています。

とはいえ、この構造は特定のクラスのプログラムにとって確かに有用に見えます。特に、上で概説した仮定が実際にプログラムに当てはまることが確かである場合はなおさらです。ただし、すべてのプログラムで使用できるわけではありません。


また、パターンを簡略化する場合は、andOrGetUserInputがほぼ確実にimpureOrFalliableComputationとしてカウントされることを考慮してください。おそらくそれらを1つのセクションに組み合わせることができます。
WolfeFan 2014

実際には、それらは凝縮されています。デモンストレーションと説明のために、それらを分離しました。
recursion.ninja
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.