2017-11-02 15 views
0

OK、それは私がハズケルにはちょうど悪いようですが、私はこれらすべての質問に固執し続けると誓っています。とにかく、私は2つのリストを取って、それらを圧縮し、合計でマップする必要があります。だからここに私がこれまで持っているもので、それが動作していない:ハスケル:地図とジップリスト

zipMapList :: [a] -> [a] -> [a] 
zipMapList x y = do 
    let zipList = zip x y 
    let mapList = map + zipList 
    mapList 

[OK]を、ここで私は、ファイルをロードしようとしたとき、私は取得していますエラーです:

HW2.hs:18:25: error: 
• Couldn't match expected type ‘(a1 -> b) -> [a1] -> [b]’ 
       with actual type ‘[(a, a)]’ 
• In the second argument of ‘(+)’, namely ‘zipList’ 
    In the expression: map + zipList 
    In an equation for ‘mapList’: mapList = map + zipList 
• Relevant bindings include 
    mapList :: (a1 -> b) -> [a1] -> [b] (bound at HW2.hs:18:9) 
    zipList :: [(a, a)] (bound at HW2.hs:17:9) 
    y :: [a] (bound at HW2.hs:16:14) 
    x :: [a] (bound at HW2.hs:16:12) 
    zipMapList :: [a] -> [a] -> [a] (bound at HW2.hs:16:1) 
    18 |  let mapList = map + zipList |        
HW2.hs:19:5: error: 
• Couldn't match expected type ‘[a]’ 
       with actual type ‘(a0 -> b0) -> [a0] -> [b0]’ 
• Probable cause: ‘mapList’ is applied to too few arguments 
    In a stmt of a 'do' block: mapList 
    In the expression: 
    do let zipList = zip x y 
     let mapList = map + zipList 
     mapList 
    In an equation for ‘zipMapList’: 
     zipMapList x y 
     = do let zipList = ... 
      let mapList = ... 
      mapList 
• Relevant bindings include 
    zipList :: [(a, a)] (bound at HW2.hs:17:9) 
    y :: [a] (bound at HW2.hs:16:14) 
    x :: [a] (bound at HW2.hs:16:12) 
    zipMapList :: [a] -> [a] -> [a] (bound at HW2.hs:16:1) 
19 |  mapList |  ^^^^^^^ 

Iちょうどドンエラーが何を意味するのかを知ると、私はリスト[a]と別のリスト[a]を取得し、それらを圧縮してマップして別のリストを取得することを意味します。なぜタプルエラー誰かが手を貸すことができますか?

+0

"合計でマップする" - それはどういう意味ですか?サンプルの入力と出力を追加できますか? –

+0

[1,2,3] [4,5,6]は[(1,4)、(2,5)、(3,6)]に圧縮され、[5,7,9]にマッピングされます。 –

答えて

0

mapは、タイプがmap :: (a -> b) -> [a] -> [b]であり、zipタイプがzip :: [a] -> [b] -> [(a, b)]の関数です。 map + zipListと記述すると、型(a -> b) -> [a] -> [b]の要素をタイプ[(a,b)]の要素に追加しようとしています。これはどういう仕組みになりますか?あなたが欲しいものを達成する方法として

、これはアルゴリズムのようになります。

  1. はzip形式のタプルの要素を合計する匿名関数または名前付き関数を記述します。再び、(+)関数の型は何ですか?タプルではなく、2つの異なる入力で機能します。したがって、追加する前にタプルを2つの入力に分割する必要があります。
  2. 上記の関数を使用して、mapを圧縮したリストに適用します。
+0

これは私がhaskellに持っている問題です。リストと別のリストを取ってから、いくつかのことをしてからリストを返すべきではないので、どうしてうまくいかないのか分かりません。私の頭の中で私はそれが働いているのを見ているので、私はこれらのエラーを見ると、私はそれが私にそれをさせない理由を得ることはできません –

+0

タイプシグネチャを見てください。他に何もない場合、彼らは同じ "形"を見ますか?それは、あなたが同じ方法でそれらの両方で理由を付けることができるかどうかについての迅速な贈与でなければなりません –

2

map + zipListx+yのように、zipListmapを合計しよう。そこで、+を関数に渡したいので、map (+) zipListにする必要があります。

しかし、待ってください。 zipListはペアのリストである、と(+)は、入力としてペアを取ることはありません。

-- simplified types for clarity 
(+) :: Int -> Int -> Int 
-- but we want 
add :: (Int, Int) -> Int 

可能な解決策は、add

add (x,y) = x+y 
-- ... 
map add zipList 

またはラムダ

map (\ (x,y) -> x+y) zipList 
を使用するために私たち自身を定義することです

またはuncurryにする+

map (uncurry (+)) zipList 

また、タイプが間違っていることに注意してください。aを合計する数値タイプにする必要があります。

zipMapList :: Num a => [a] -> [a] -> [a] 
zipMapList xs ys = map (uncurry (+)) (zip xs yz) 
-- or, exploiting zipWith 
zipMapList xs ys = zipWith (+) xs yz