簡體   English   中英

如何在Haskell中編寫for循環?

[英]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使用多種不同方式的組合來對數據(列表等)進行“排序”循環。

幫助此的兩個重要事項是:

  1. 易於聲明函數並將其傳遞給我們,類似於我們對oops語言中的變量所做的操作
  2. 廣泛的模式匹配

因此,例如,我在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函數,例如地圖,折疊等。

我建議您使用幾種在線資源之一來更熟悉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.

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