2014-05-12 43 views
0

我想將類型的新實例映射到列表的內容。 例如:將類型映射到Haskell中的列表

MyList = [1..10] 
data MyType = MyType Int 

map (MyType (\x -> x)) MyList 

我想要得到的東西像[MyType的,MyType的...],其中每個MyType的int值來自列表。 這不起作用,我該如何做到這一點?或者有更好的辦法?

謝謝!

編輯:我忘了,MyType的是更復雜的,例如:

data MyType = MyType Int String Bool 

這樣,我怎麼能在列表中的MyType的詮釋部分保持固定喜歡的MyType其他值只是整數映射。 ..「測試」是真的(這就是爲什麼我想到lambda)。

+0

術語說明:在Haskell中,(類型類的)實例是一個類型,而不是一個值。因此,不應該將「將新類型的實例映射到列表內容」,而應該說「從列表內容中創建一個類型的值」,或者(將Lee的答案視爲理所當然)「將構造函數映射到一個列表」。 – duplode

+0

@Manuel:您應該閱讀Haskell的簡介。 – nomen

回答

2

MyType構造是一個功能Int -> MyType,所以你可以只使用

let mapped = map MyType MyList 

如果你有更復雜的類型如MyType Int String Bool那麼你可以做:

let mapped = map (\i -> MyType i "test" True) MyList 
+0

如果將MyType定義爲MyType Int字符串布爾值,但我想要將String和Bool保留爲固定值,例如:map MyType MyList「test」True? – Manuel

+0

@Manuel map(\ x - > MyList x「test」True)myList'或'[MyList x「test」True | x < - myList]'。 – hammar

+0

@Manuel - 您可以在lambda中執行映射 - 請參閱更新。 – Lee

0

當寫data MyType = MyType Int你聲明MyType with a single *constructor*的MyType which takes an詮釋and create an object of type MyType`。

有時候令人困惑的部分是,當只有一個類型和構造函數時,約定會使用相同的名稱 - 就像您一樣。你可以完全寫:

data MyType = MyConstructor Int 

在這種情況下,作爲@Lee指出,MyConstructorInt -> MyType類型的功能,所以你可以把它當作map函數的第一個參數。

相關問題