エルムが内蔵されzip
機能はありませんが、それはList.map2
の面でそれを定義するのは簡単です:
zip : List a -> List b -> List (a, b)
zip = List.map2 (,)
あなたは、それ自体でバラバラリストにそれを使用することはできませんが、モデル2の最初のn
アイテムを使用してModel1のサブリストを圧縮することができます。ジップアップする必要があるもののリストを取得するには、ジップ部分にはList.take
、次のModel1エンティティで圧縮する必要がある残りの項目はModel2から取得するためにList.drop
を使用する必要があります。これは、次のような関数を使って行うことができます。 zip
を使用すると、どちらのリストで停止しようとしていること
toViewModel : Model1 a b -> Model2 c -> ViewModel a b c
toViewModel m1 m2 =
case m1 of
[] ->
[]
((m1ID, m1List)::rest) ->
let
len = List.length m1List
init' = List.take len m2
tail' = List.drop len m2
in
(m1ID, zip m1List init') :: toViewModel rest tail'
通知は最初に終わるので、あなたが不均一長さのリストを持っている場合、アイテムがドロップを取得しようとしています。
編集からここに明示的な再帰が主な機能は、マッピング
を介して第1のグループにモデル2になり、これを解決するための別の方法を実現することができるような方法で分離され、これを行うための追加的な方法です各リストには、同等のModel1エントリの適切な数の要素が含まれています。
ここでは、リストを複数の小さなリストに分割する関数takes
を定義します。これらのリストのサイズは、最初のパラメータとして渡されます。
takes : List Int -> List a -> List (List a)
takes counts list =
case counts of
[] -> []
(x::xs) -> List.take x list :: takes xs (List.drop x list)
今あなたが内部のリストを圧縮することができますので、あなたはMODEL1入力に対してそれをマッピングすることができ、グループにモデル2リストをtakes
機能を使用することができます。ここで
toViewModel : Model1 a b -> Model2 c -> ViewModel a b c
toViewModel model1 model2 =
let
m2Grouped = takes (List.map (List.length << snd) model1) model2
mapper (m1ID, m1List) m2List = (m1ID, zip m1List m2List)
in
List.map2 mapper model1 m2Grouped
:
次の例を考えてみてください。実際のコードでは、具体的な型ですので、コードを一般化すると間違えてしまいました。 – Eric
私は私の答えに論理エラーを修正し、現在廃止されたタイプのエイリアスの推奨事項を削除しました –
答えは正確で一般化されたサマリーですか? "奇妙な形のリストを組み合わせるには、' zip = List.map2(、) 'はおそらく十分な柔軟性がないので、パターンマッチングと再帰を使用してください。" – Eric