簡體   English   中英

我在Haskell中對Zip的定義有什么問題?

[英]What is wrong with my definition of Zip in Haskell?

--  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"]

如果您重新編寫zip以獲得對Haskell的了解,我建議您嘗試在不使用列表推導的情況下編寫它。 列表理解功能強大,但是對於Haskell中的某些特定情況而言,它有點像便捷的簡寫。 而且,如您所見,在其他情況下使用它們可能需要非標准擴展名(例如ParallelListComp )。

考慮一下在一般情況下zip需要做什么,以及如果不滿足一般情況會發生什么(這可能以兩種方式發生!)。 該函數的方程式應該自然而然地落入其中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM