割り当ては、正の intのリストが 14319 を返すようdecimal :: [Int] -> Int
に 10 進数を与える関数を定義することです。私はその関数を使用します。[1,4,3,1,9]
Integer
fold
ここから始めるのは本当に良いアイデアがないので、正しい方向にプッシュする必要があるだけですが、ホーナーのスキームについて考えていました。ありがとう!
これは私の変種です
import Data.List
decimal :: [Int] -> Int
decimal xs = foldl' (\sum (pos,x) -> (sum + x*(10^(l-pos)))) 0 $ zip [1..] xs where
l = length xs
*Main> decimal [1,4,3,1,9]
14319
Haskell
には、非常に強力な武器、つまりリスト処理用の機能があります。これらの関数の 1 つはfoldl
(厳密なバージョンのfoldl
,を使用しますfoldl'
) 型です
foldl :: (a -> b -> a) -> a -> [b] -> a
この関数は、3 つの引数、累積引数、処理されたリスト、および最も重要な、アキュムレータとリスト要素を使用して任意の操作を実行し、結果を返す関数を受け取ります。Fold は非常に重要な機能なので、詳細なマニュアルを読む必要があります。
しかし、問題があります。式には 3 つの変数があります。処理されたリスト要素 ( x
)、リストの合計の長さ ( n
)、処理された要素の位置 ( k
) です。しかし、トラバースできるfoldl
要素は 1 つだけです。各要素の位置をどのようにトラバースできますか? Int
最初の要素が位置で、2 番目の要素が値のタプルを形成しましょう。これは標準的なトリックです。zip
関数は次のように役立ちます。
zip [1..] [1,4,3,4,6]
[(1,1),(2,4),(3,3),(4,4),(5,6)]
タプルのリストをfoldl
関数に渡し、リストの各要素をfoldl
呼び出しlambda function
(\sum (pos,x) -> (sum + x*(10^(l-pos))))
、結果を合計するよりもsum