質問

--  eg. myzip [’a’, ’b’, ’c’] [1, 2, 3, 4] -> [(’a’, 1), (’b’, 2), (’c’, 3)]
myzip :: Ord a => [a] -> [a] -> [(a,a)]
myzip list1 list2 = [(x,y) |  [x, _] <-list1, [y,_] <-list2 ] 

私はこのエラーメッセージ:

 Occurs check: cannot construct the infinite type: a = [a]
    When generalising the type(s) for `myzip'
Failed, modules loaded: none.
役に立ちましたか?

解決

が問題:ひとつは、パターンマッチ一つはタイプシグニチャー、一つは自然の一覧を理解したりしています。こちらは修正済みバージョンへアップデー:

{-# LANGUAGE ParallelListComp #-}
myzip :: [a] -> [b] -> [(a, b)]
myzip xs ys = [(x, y) | x <- xs | y <- ys]
  • のオリジナルタイプの署名により、 [a] -> [a] -> [(a, a)], とともリストした同じタイプの要素となります。の Ord a したが不要と思われ、その特定の種類の要素が許可しない.
  • のパターン [x, _] <- list1 この各要素に list1 でなければな二つの要素一覧です。使用 x <- list1 です。
  • 二つのリストの理解はシリーズの代わりに行なった。思い通りのカンマで区切と送料のご負担を軽減するため、項目からlist1、それからlist2"(シリーズ)思考の管ている。

の違いをシリーズの並列:

> [[x, y] | x <- "abc", y <- "123"] -- series
["a1","a2","a3","b1","b2","b3","c1","c2","c3"]
> [[x, y] | x <- "abc" | y <- "123"] -- parallel
["a1","b2","c3"]

他のヒント

あなたはHaskellの洞察を得るためにzipを書き込み直す場合は、

は、私はあなたのリストの内包表記を使用せずにそれを書いてみることをお勧めしたいです。リスト内包は強力ですが、ややHaskellではいくつかの特定の例のための便利な速記のようなものです。そして、あなたは他のケースでそれらを使用するために、参照として(例えばParallelListCompなど)非標準の拡張機能が必要な場合があります。

zipは、一般的なケースで行う必要があり、どのような一般的なケースが満たされない場合に何が起こるかを考えてみて(二つの方法で発生する可能性がどの!)。関数の方程式は、その外の自然落下する必要があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top