用init和last函数理解haskell递归代码

时间:2018-01-11 13:42:17

标签: haskell recursion

func loadData() {
    postKey = post["key"] // or something else, you'll need to fetch the data base key from the current dictionary
    Database.database().reference().child("posts").child(postKey).observeSingleEvent(of: .value) { (snapshot) in
        if let dict = snapshot.value as? [String: AnyObject] {
            self.titeLabel.text = dict["title"] as? String
    }
}

我正在尝试理解下面的haskell代码并提出以下问题:

在haskell代码中,冒泡将在第一行评估2次,用于初始冒泡,其他用于最后冒泡或仅评估一次。

bubblesort2 :: (Ord a, Show a) => [a] -> [a]
bubblesort2 [] = []
bubblesort2 [x] = [x]
bubblesort2 (x:y:rest) =
    bubblesort2 (init bubbled) ++ [last bubbled]
    where
        (first,second) = if x > y then (y,x) else (x,y)
        bubbled = first : bubblesort2(second:rest)

1 个答案:

答案 0 :(得分:2)

每次调用bubbled时,

bubblesort2只会被评估一次。

您的where条款bubbled = first : bubblesort2(second:rest)定义bubbled并将其与thunk相关联。这个thunk是bubbled的值的替身。

如果评估bubbled(或init bubbled)强制last bubbled的值,则thunk将被强制值替换,可以重复使用(不重新评估) last bubbled(或init bubbled)。