多くの場合、複数の関数を同じデータにマップする必要があります。これを行うためにdpMapを実装しました
dpMap fns = (`map` fns) . flip ($)
dpMap は 1 つの関数です。これは、データ dt を 1 回だけ読み取ることを意味しますか?
例として、リスト dt の最小値と最大値を計算することを検討してください。
minimax dt = (dpMap [minimum, maximum]) dt
(dt を取り除くことはできますが、-XNoMonomorphismRestriction を使用する必要があります)
このようなポイントフル形式で同じ関数を実装するよりもパフォーマンス上の利点はありますか?:
minimax2 dt = [minimum dt, maximum dt]
編集:定数メモリで動作する dpMap の一般的な実装はありますか?
別の素敵なブログ投稿を見つけました: http://www.haskellforall.com/2013/08/composable-streaming-folds.html ;これが役に立てば幸いです。
EDIT2:もう少しコンテキストの後、ここに解決策があります.dpMapの正確な実装はありませんが、パターンは十分に単純であるため、別の機能を保証しません:
minimax = (,) <$> minimum <*> maximum
使用法:
> minimax [1..100]
(1,100)
合計と長さも計算したい場合
func = (,,,) <$> minimum <*> maximum <*> sum <*> length
使用法:
> func [1..100]
(1,100,5050,100)