Ini diskusi yang menarik. Saya pikir contoh @ flodel sangat bagus. Namun, saya pikir ini mengilustrasikan poin saya (dan @koshke menyebutkan ini dalam komentar) yang returnmasuk akal ketika Anda menggunakan imperatif alih-alih gaya pengkodean fungsional .
Bukan untuk mempercayai intinya, tetapi saya akan menulis ulang fooseperti ini:
foo = function() ifelse(a,a,b)
Gaya fungsional menghindari perubahan status, seperti menyimpan nilai output. Dalam gaya ini, returntidak pada tempatnya; foolebih mirip fungsi matematika.
Saya setuju dengan @flodel: menggunakan sistem variabel boolean yang rumit di barakan menjadi kurang jelas, dan tidak ada gunanya saat Anda memilikinya return. Apa yang membuatnya barbegitu menerimareturn pernyataan adalah bahwa itu ditulis dalam gaya imperatif. Memang, variabel boolean mewakili perubahan "negara" yang dihindari dengan gaya fungsional.
Sangat sulit untuk menulis ulang bardengan gaya fungsional, karena ini hanya pseudocode, tetapi idenya adalah seperti ini:
e_func <- function() do_stuff
d_func <- function() ifelse(any(sapply(seq(d),e_func)),2,3)
b_func <- function() {
do_stuff
ifelse(c,1,sapply(seq(b),d_func))
}
bar <- function () {
do_stuff
sapply(seq(a),b_func) # Not exactly correct, but illustrates the idea.
}
The whileLoop akan menjadi yang paling sulit untuk menulis ulang, karena dikendalikan oleh negara perubahan kea .
Kehilangan kecepatan yang disebabkan oleh panggilan ke returndiabaikan, tetapi efisiensi yang diperoleh dengan menghindari returndan menulis ulang dengan gaya fungsional sering kali sangat besar. Memberitahu pengguna baru untuk berhenti menggunakan returnmungkin tidak akan membantu, tetapi membimbing mereka ke gaya fungsional akan memberikan hasil.
@ Paul returndiperlukan dalam gaya imperatif karena Anda sering ingin keluar dari fungsi pada titik yang berbeda dalam satu lingkaran. Gaya fungsional tidak menggunakan loop, dan karenanya tidak perlu return. Dalam gaya fungsional murni, panggilan terakhir hampir selalu merupakan nilai pengembalian yang diinginkan.
Dalam Python, fungsi membutuhkan returnpernyataan. Namun, jika Anda memprogram fungsi Anda dalam gaya fungsional, kemungkinan Anda hanya akan memiliki satureturn pernyataan: di akhir fungsi Anda.
Menggunakan contoh dari posting StackOverflow lain, katakanlah kita menginginkan fungsi yang mengembalikan TRUEjika semua nilai dalam suatu diberi xmemiliki panjang ganjil. Kita bisa menggunakan dua gaya:
# Procedural / Imperative
allOdd = function(x) {
for (i in x) if (length(i) %% 2 == 0) return (FALSE)
return (TRUE)
}
# Functional
allOdd = function(x)
all(length(x) %% 2 == 1)
Dalam gaya fungsional, nilai yang akan dikembalikan secara alami jatuh di ujung fungsi. Sekali lagi, ini lebih mirip fungsi matematika.
@GSee Peringatan yang diuraikan dalam ?ifelsepasti menarik, tapi saya tidak berpikir mereka mencoba untuk menghalangi penggunaan fungsi. Bahkan, ifelsememiliki keunggulan fungsi vectorizing secara otomatis. Misalnya, pertimbangkan versi yang sedikit dimodifikasi foo:
foo = function(a) { # Note that it now has an argument
if(a) {
return(a)
} else {
return(b)
}
}
Fungsi ini berfungsi dengan baik ketika length(a)1. Tetapi jika Anda menulis ulang foodenganifelse
foo = function (a) ifelse(a,a,b)
Sekarang foobekerja pada ukuran berapa pun a. Bahkan, itu akan berfungsi ketika amatriks. Mengembalikan nilai dengan bentuk yang sama testdengan fitur yang membantu vektorisasi, bukan masalah.
returntidak perlu bahkan dalam contoh terakhir. Menghapusreturnmungkin membuatnya sedikit lebih cepat, tetapi dalam pandangan saya ini karena R dikatakan sebagai bahasa pemrograman fungsional.