dobb[] = [] 。
dobb (x:xs) = [x * 2| x<- xs]
我真的是haskell的新手,本周開始學習它。我想創建一個函式,將一個串列中的每個元素都乘以2,所以這個串列將從[1,2,3]到[2,4,6]。我的代碼運行良好,但它跳過了串列的第一個元素,從[1,2,3]到[4,6]。我怎樣才能使代碼也能乘以第一個元素呢?
[x*2 | x<-[1.5]
我已經找到了這行代碼,它做了我要找的事情,但我不明白如何從這行代碼出發,把它轉換成一個對所有串列都有效的函式。
uj5u.com熱心網友回復:
我將解決你最后一個問題,
如何從這行代碼開始,
[x*2 | x <- [1.5] ]并將其轉換為適用于所有串列的函式[?]
這被稱為泛化,是通過抽象實作的。首先我們為它命名,
foo = [x*2 | x <- [1.5] ]
然后我們命名我們用作例子的那塊任意的資料來進行處理,
foo = let {xs = [1...5]}。in [x*2 | x <- xs]
然后我們通過洗掉內部定義中的那塊任意資料來抽象它,讓它成為函式引數,由這個,現在,函式的呼叫者指定:
foo xs = [x*2| x <- xs]
就這樣,一般的函式在所有的串列上作業,所做的事情與它在我們最初使用的具體例子上做的一樣。
uj5u.com熱心網友回復:
如果你使用模式(x:xs),那么你就解壓串列,這樣x就是串列的head(第一個專案),而xs就是該串列的tail(剩余專案)。對于一個串列 [1,4,2,5], x 將指向 1, 而 xs 指向 [4,2,5] 。
在串列理解中,你使用x <- xs作為生成器,因此你列舉了剩余的元素。此外,串列理解中的 x 并不是串列的頭部,而是一個更區域的變數。
你可以使用串列理解并在整個串列上作業,所以:
你可以使用串列理解并在整個串列上作業。
dobb :: Num a => [a] -> [a]
dobb xs = [x * 2| x <- xs]/code>
我們也可以用map :: (a -> b) -> [a] -> [b]對元素進行同樣的操作:
dobb :: Num a => [a] -> [a]
dobb = map (2*)/code>
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/316953.html
標籤:
