Một cách hay để thực hành chức năng ẩn danh là sử dụng chúng với chức năng bậc cao gấp hoặc bản đồ.
Sử dụng bản đồ như một điểm nhập cảnh,
định nghĩa cơ bản của bản đồ,
map f [] = []
map f (x:xs) = f x : f xs
xây dựng lên một ví dụ,
>>> let list = [0..4]
>>> let f x = x + 1
Áp dụng bản đồ chúng tôi có được,
>>> map f list
[1,2,3,4,5]
Bây giờ, chúng tôi có thể bỏ qua t ông tuyên bố của f và thay thế nó bằng chức năng ẩn danh,
>>> map (\x->x+1) list
[1,2,3,4,5]
sau đó chúng ta suy ra, đồ danh sách f == bản đồ (\ x-> x + 1) danh sách, do đó
f = \x-> x + 1 --- The same as f x = x + 1, but this is the equivalent lambda notation.
sau đó bắt đầu với một hàm đơn giản, chúng ta sẽ thấy cách dịch nó thành một hàm ẩn danh và sau đó một hàm ẩn danh có thể dựa vào trừu tượng lambda như thế nào.
Làm bài tập thử dịch f x = 2 * x.
Bây giờ phức tạp hơn, một chức năng ẩn danh mà mất hai đối số,
Một lần nữa một ví dụ làm việc,
>>> let add x y = x + y
>>> foldl' add 0 [0..4]
10
Có thể viết lại sử dụng chức năng ẩn danh như,
>>> foldl' (\x y -> x + y) 0 [0..4]
Một lần nữa sử dụng bình đẳng chúng ta suy ra rằng add = \ xy -> x + y
Hơn nữa, trong hàm hakell, hàm số của hàm là một đối số, và chúng ta c một phần áp dụng nó, chúng ta có thể viết lại hàm ẩn danh trước đây của chúng ta như, thêm = \ x -> (\ y -> x + y).
Vậy đâu là mẹo ?? Bởi vì, tôi chỉ cho thấy việc sử dụng hàm ẩn danh thành một thứ tự cao, và bắt đầu từ đó, cho thấy cách khai thác này có thể được khai thác để viết lại hàm bằng cách sử dụng ký pháp lambda. Tôi có nghĩa là làm thế nào nó có thể giúp bạn tìm hiểu làm thế nào để viết ra chức năng vô danh?
Đơn giản là vì tôi đã cung cấp cho bạn (hiển thị cho bạn) khung hiện có bằng chức năng đặt hàng cao.
Khung làm việc này là cơ hội lớn để bạn có thể sử dụng ký hiệu này.
Bắt đầu từ đó một loạt các bài tập vô cực có thể được suy ra, ví dụ cố gắng làm như sau.
A - Find the corresponding anonymous function ?
1 - let f (x,y) = x + y in map f [(0,1),(2,3),(-1,1)]
2 - let f x y = x * y in foldl' f 1 [1..5]
B - Rewrite all of them using lambda notation into a declarative form (f = \x-> (\y-> ...)
Và vân vân ....
Để tóm tắt,
Một chức năng như
(F0) f x1 x2 ... xn = {BODY of f}
luôn có thể được viết lại như,
(F1) f = \x1 x2 ... xn -> {BODY of f}
nơi
(F2) (\x1 x2 ... xn -> {BODY of f})
hình thức F2 chỉ là chức năng ẩn danh, một bản dịch tinh khiết của hàm thành dạng phép tính lambda. F1 là một ký hiệu lambda khai báo (vì chúng ta khai báo f, như chúng ta định nghĩa nó, ràng buộc nó với F2 ẩn danh). F0 là ký hiệu thông thường của Haskeller.
Một lưu ý cuối cùng tập trung vào thực tế chúng tôi có thể đặt dấu ngoặc đơn giữa các đối số, điều này tạo ra một đóng cửa. Làm điều đó có nghĩa là một tập hợp con của mã của hàm có thể được đánh giá đầy đủ bằng cách sử dụng một tập con của đối số của hàm, (nghĩa là chuyển đổi thành một biểu mẫu không có biến tự do nào xảy ra), nhưng đó là một câu chuyện khác.
(\ xy -> x + y) :: Num a => a -> a -> a Bạn cố gắng thêm z vào hàm – Vladimir