2014-03-13 34 views
0
mymap f _ [] = [] 
mymap f x (y:ys) = f first y : mymap (f x ys) 
    where if x /= [] first = head(x) else --there will not be else just playing around 

我想要做的是實現內置映射,而不是一個列表,f有2個參數(列表)。當ys變成[]時,我想創建一個新的列表(通過調用mymamp)而不是x,我想使用tail(x)== xs並繼續這種方式直到xs變成[]。並將所有這些列表放到最終列表中。但我不能找到一個自動/遞歸的方式來做到這一點。發生檢查:不能構造無限類型:a0 = [a0]

+0

你想要做類似'zipWith'的事情嗎? – bheklilr

+0

您有語法錯誤。 'where子句包含定義,但是你在這裏寫了一個'if'表達式。你應該真的通過一些Haskell教程,像http://learnyouahaskell.com/ –

回答

1

首先,你打電話head(x)沒有驗證x不是空的 - 這不是一個好主意。相反,在x上也使用模式匹配!

mymap f _ [] = [] 
mymap f (x:xs) (y:ys) = f x y : f x ys 
-- add the other cases as well 

現在,錯誤:請注意,你在的地方使用f

  1. f first y - 在這裏f是類型a->b->c

  2. f x ys - 這裏f的類型[a]->[b]->c

Haskell無法推斷出f的類型,因此它進行了有根據的猜測,並且無法推斷出另一個變量的類型 - 因此是錯誤。

這種情況下的最佳建議 - 在mymap中添加一個類型簽名。 Haskell是一種聰明的語言,在大多數情況下,它可以在沒有您的類型簽名的情況下管理得很好 - if,這是一個大的如果,您的代碼是有效的。所以總是從一個類型簽名開始。

+0

我編輯了代碼。現在呢? –

+0

我不認爲你的代碼現在甚至解析 - 'where'子句不是那樣定義的。我真的會推薦模式匹配方法。 – Benesh

+0

我討厭哈斯克爾:( –

相關問題