[英]How to write a for loop in Haskell?
我真的對Haskell並不陌生,也對如何實現for循環感到困惑,因為我知道我們需要對它們使用遞歸。
例如,我有一個列表[1,2,2,4,1]
並想編寫一個函數,將每2
更改為3
。 我將如何去做呢? 在Java中,我知道我會寫以下內容
public void replace_two(List<Integer> ints) {
int i = 0;
for (int x: ints) {
if (x == 2) {
ints.set(i, 3);
}
i++;
}
System.out.println(ints);
}
但是我不確定如何用Haskell重現其他類似內容?
Haskell中沒有一個for
循環的替代品。 替換取決於您要執行的操作。 在這種情況下, map
將是合適的:
replace_two = map go
where
go 2 = 3
go x = x
它是這樣的:
Prelude> replace_two [1,2,2,4,1]
[1,3,3,4,1]
Prelude>
Haskell使用多種不同方式的組合來對數據(列表等)進行“排序”循環。
幫助此的兩個重要事項是:
因此,例如,我在haskell中聲明了一個函數,如果輸入為3,則返回2,否則返回輸入。
return2 x = if x == 3 then 2 else x
現在,我們想將此功能應用於列表的每個元素。 所以我們將使用模式匹配
apply (x:xs) = return2 x : apply xs
apply [] = []
在這里,模式x:xs
將中斷列表並占據x
的第一個元素,而xs
將擁有列表的其余部分。 在函數內部,您可以看到我們已遞歸應用它。
我沒有在IDE中檢查以上代碼,因此可能存在語法錯誤,還有其他您需要驗證的內容(列表結尾,在上述代碼中,該函數將導致異常)。
上面的模式很常見,因此核心庫中還有另一個函數可以執行此操作,稱為map。 因此,您可以完成以下操作:
map return2 [your list]
就像我在haskell中所說的那樣,有很多方法可以使事物本質上循環,但是從根本上講,它們分解為將函數應用於數據結構中的各個項目。 在其之上構建了許多haskell函數,例如地圖,折疊等。
另一種使用模式和遞歸的基本方法。
replace :: [Int] -> [Int]
replace [] = [] -- base case
replace (2:x) = 3:replace(x) --if 2 then replace by 3
replace (y:x) = y:replace(x) -- do nothing
使用具有匿名功能的map
:
λ> map (\x -> if x==2 then 3 else x) [1,2,2,4,1]
[1,3,3,4,1]
除了map
,也許您可以使用Control.Monad
forM
來模仿其他命令式語言中的for
循環:
import Control.Monad
arr = [1, 2, 2, 4, 1]
forM arr $ \i ->
if i == 2 then return 3 else return i
但是,您需要了解什么是Monad
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.