0

map2は、ls1とls2の2つのリストと、関数Fを受け取り、ls1とls2の最短値と同じ長さのリストを返します。このリストでは、i番目の要素はls1とls2のi番目の要素にFを適用した結果です。 (この順序で)

module Map2 where

map2 lst1 lst2 f = map2_iter lst1 lst2 f len 0 []
    where len = (min (length lst1), (length lst2))
map2_iter (x:lst1) (y:lst2) f len i acc = if (i == len)
                      then acc
                      else let res = (f x y) in
                      map2_iter (lst1) (lst2) (f) (len) (i+1) ((res):acc)
map2_iter [] [] f len i acc = []

次のエラーが発生しました

Map2.hs:3:20:
No instances for (Eq (Int -> Int), Num (Int -> Int, Int))
  arising from a use of `map2_iter'
Possible fix:
  add instance declarations for
  (Eq (Int -> Int), Num (Int -> Int, Int))
In the expression: map2_iter lst1 lst2 f len 0 []
In an equation for `map2':
    map2 lst1 lst2 f
      = map2_iter lst1 lst2 f len 0 []
      where
          len = (min (length lst1), (length lst2))

このエラーが何を意味するのかよくわかりません。誰か助けてもらえますか?

また、これはハードウェアではなく、テストの準備です。

4

1 に答える 1

4

Int -> Intエラーメッセージは、関数が等しいかどうかを比較できないこと、および(Int -> Int, Int)タプルは数値ではないことを示しています。なぜそれがあなたにこれを言っているのですか?lenコード内に(Int -> Int, Int)タプルがあり、それが等しいかどうかを比較し、数値として処理しようとしているためです。

では、どうしてlen数字になったのでしょうか。(,)Haskellでタプルを作成するために使用されます。書き込むと、最初の要素がで、2番目の要素が。で(x,y)あるタプルが作成されます。したがって、最初の要素がで、2番目の要素がであるタプルを作成します。したがって、関数(関数に評価されるため)と数値を含むタプルになります。xy(min (length lst1), (length lst2))min (length lst1)length lst2min (length lst1)

PS:この関数をあなたがしたように末尾再帰的に書くのは良い考えではないことも指摘しておきます。あなたがそれを書いた方法では、結果全体が生成されるまで、結果の最初の要素にアクセスすることはできません(結果のリストも間違った順序になります)。より「ナイーブな」非末尾再帰的な方法でそれを書くと、怠惰になり、パフォーマンスが向上します。また、より簡単になります。

于 2013-02-28T18:06:35.733 に答える