3
大家會想要 java 也有 for[each]-else 的 API 嗎? (www.facebook.com)
IngramChen 積分 0

好奇在 functional 界是怎麼處理這種問題?

這種 iteration 中要做不同的 branch task (side effect) 有漂亮的解法嗎?

caterpillar 積分 5 編輯於

就原討論來看,跟 Functional programming 比較沒有關係,感覺只是想設計 Method chain 的問題,也就是將 if 判斷從程式碼中去除,或說是隱藏至 API 中。

如果真要跟 Functional programming 有關係,那麼就得考量像 filterElse、mapElse、reduceElse 之類的 API,因為每個人在迴圈中做的事不同,而且 xxxElse 可以指定的兩個任務必須是相同性質。

例如 filterElse 的話,兩個任務都要是 filter,而不能像是去做得到單一值的任務,或者是去做了 map 的動作,也就是像(也許還得加上 p1、p2、p3 這類判斷條件):

source.filterElse(p1, a, b)  // a 、b都是filter,只是filter條件不同
   .mapElse(p2, c, d)   // c、d都是map,只是map方式不同
   .reduceElse(p3, e, f); //  e、f都是 reduce,只是reduce方式不同

原討論舉 foreachElse 容易讓人誤會,因為 Java 8 中 foreach 的本質就是 imperative 的。

至於 while 或 for 要不要搭 else,那太容易造成誤會,Python 中雖然有,一直以來也不建議使用,有人說那是因為 else 只會在迴圈中沒有 break 時執行,不過,改成 else 會在迴圈中有 break 時執行,或者是 else 只有在迴圈沒有執行時執行,我想都會有人有話說。

cfchou 積分 0

是指在 iteration 中 break 嗎?

我也想知道 fp 的 idiom

好像 for..loop 本身就是很 imperative, 可是 fp 偏愛 declarative

或許簡單的情況下可以:

collection.takeWhile(predicate).foreach(foo)

複雜的 看過一種做法:

collection.toStream 後每個 iteration returns Either<Success, Fail> 然後 lazily evaluate, stop when getting Fail

cfchou 積分 1

看起來作者是想要 for ... else { if no iteration }

不過看到這語法可能有人會認為是 for ... else { if any break }

而這在 python 是 for ... else { if none break }

Effective Python1 Item 12: Avoid else Blocks After for and while Loops

也許 refactor 比較增加這種語法好

IngramChen 積分 0 編輯於

for ... else 很難懂吧, else 的條件是什麼? 有沒有 break ?

for (...) {

} else if break {

}

這樣也許好一點