8

最後のリスト要素を除いて、リストのすべての要素をどのようにマッピングするのが最善ですか?

リストがlet l = [1,2,3,4]あり、取得したいとします[2,3,4,4]

私は解決策を持っていますが、それを行う「機能的な」方法のようには感じません(ghciで):

let l = [1,2,3,4]
let len = toIntegral $ length l -- to avoid a type mismatch Integer <-> Int
let l1 = zip l [1..]
let l2 = map (\(x,y) -> if y < len then (x + 1,y) else (x,y)) l1
let l3 = map (fst) l2

あまり良くありません...もっと良い方法があることを願っています! 私は関数型プログラミングの初心者なので、どこから探し始めればよいかわかりません。

4

5 に答える 5

10

これは、いつものように、疑似パラモーフィズムの仕事です。

import Data.List (tails)

mapButLast :: (a -> a) -> [a] -> [a]
mapButLast f = foldr g [] . tails where
  g (x:_:_) r = f x : r
  g xs      _ = xs

または、適切paraに書くだけです

mapButLast f = para g [] where
  g x [] r = [x]
  g x _  r = f x : r

どこ

para f z (x:xs) = f x xs (para f z xs)
para f z []     = z
于 2014-09-15T17:22:25.200 に答える
0

リスト内包表記とソリューションを比較する試みを使用して代替案を追加したいだけです(初めて試したので、正しく行わなかったかどうかを教えてください)

reverse $ last l : [f x | x <- tail (reverse l)]

他のほとんどのソリューションよりも遅いです (以下のレポート リンクを参照)。

サンプル プログラム ( allbutlast.hs ) を次に示します。上記のすべてのソリューション、簡単なクイックチェックテスト、および基準を使用したベンチマークが含まれています。

実行の前提条件: QuickCheck と基準

cabal update
cabal install QuickCheck
cabal install -j --disable-tests criterion

実行

ghc -O2 --make allbutlast.hs
./allbutlast --output allbutlast.html

サンプル レポート: allbutlast の基準レポート

于 2014-09-17T11:34:24.157 に答える