2017-02-12 10 views
3

私は、リストA〜Fを含むリストlettersとリスト1〜6を含むリストnumsの2つのリストを持っているとします。Elmでループを使ってリストを構築するには?

Elmでは、可能なすべての組み合わせ(A1、C6、F3、D2など)を含むリストをプログラマチックに作成するにはどうすればよいですか?

これはコードの優雅さを目的としており、可能なすべての組み合わせをハードコードすることは同等です。 JavaScriptで

、それは何かのような...

const nums = [1,2,3,4,5,6]; 
 
const letters = [`a`,`b`,`c`,`d`,`e`,`f`]; 
 

 
const combineLists = (a,b)=>{ 
 
    const newList = []; 
 
    a.forEach(aEl=>{ 
 
    b.forEach(bEl=>{ 
 
     newList.push(aEl + bEl); 
 
    }) 
 
    }) 
 
    return newList; 
 
} 
 
      
 
console.log(combineLists(letters,nums));

どのようエルムで同等のcombineLists機能を記述しで表すことでしょうか?

答えて

3

私はこれが最善の実装であることをわからないんだけど、あなたはこれを試すことができます。

import Html exposing (..) 


nums : List Int 
nums = 
    [ 1, 2, 3, 4, 5, 6 ] 


letters: List String 
letters = 
    [ "a", "b", "c", "d", "e", "f" ] 


combineLists : List a -> List b -> List String 
combineLists list1 list2 = 
    List.concatMap 
     (\elList1 -> 
      List.map 
       (\elList2 -> toString elList1 ++ toString elList2) 
       list2 
     ) 
     list1 


main = 
    text <| toString <| combineLists letters nums 

これは、同じことを行うための別の方法が考えられます。ここでは

import Html exposing (..) 


nums : List Int 
nums = 
    [ 1, 2, 3, 4, 5, 6 ] 


letters: List String 
letters = 
    [ "a", "b" , "c" , "d", "e", "f" ] 


combineLists : List a -> List b -> List String 
combineLists list1 list2 = 
    List.map toString list1 
     |> List.concatMap 
      (\e1 -> 
       List.map (toString >> String.append e1) list2 
      ) 


main = 
    text <| toString <| combineLists letters nums 
+0

からandThenを使用して、別の可能性がありますされますcombineLists' functio –

9

は私の提案です、私が最も凝縮可能

module Main exposing (..) 

import Html exposing (..) 


nums : List Int 
nums = 
    [ 1, 2, 3, 4, 5, 6 ] 


letters : List String 
letters = 
    [ "a", "b", "c", "d", "e", "f" ] 


main = 
    nums 
     |> List.map toString 
     |> List.concatMap (\n -> List.map (String.append n) letters) 
     -- or in point free style 
     -- |> List.concatMap (String.append >> flip List.map letters) 
     |> toString 
     |> text 

Point free styleは同じ広報を持っていないようだと思うましたエルムにある場所のIDE、それはHaskellでないとして、私は完全を期すためにそれを含めると、私は自分のコード

2

を書くような方法は、ここで私は、これは `を実装する方法感謝List.Extra

import Html exposing (text) 
import List.Extra exposing (andThen) 

nums : List Int 
nums = 
    [ 1, 2, 3, 4, 5, 6 ] 


letters : List String 
letters = 
    [ "a", "b", "c", "d", "e", "f" ] 

main = 
    andThen 
     (\num -> andThen 
       (\letter -> [(toString num) ++ letter]) 
       letters) 
     nums 
    |> toString 
    |> text 
+0

またかなり良い答え –

関連する問題