2015-11-24 13 views
5

Tôi có Mảng mảng. Tôi cần phải làm phẳng chúng và tôi sử dụng:Nếu Array.append không có đối số có thể thay đổi được áp dụng một phần thì lambda có thể bị xóa

Array.fold (fun acc el -> Array.append acc el) [||] arr2d 

Lint nói với tôi rằng:

"Nếu Array.append có lẽ không thể thay đổi một phần áp dụng thì lambda có thể được gỡ bỏ"

Điều đó có nghĩa là gì? Làm thế nào tôi có thể loại bỏ lambda?

+1

Là một sang một bên những mã có thể được rút ngắn: 'id arr2d Array.collect ' – Sehnsucht

+0

Có thể được rút ngắn lại thành 'Array.concat arr2d' –

Trả lời

9

Bất kỳ hàm lambda nào ở dạng (fun x -> f x) đều có thể được biểu thị là f. Giữ điều kiện bất biến.

Trong mã của bạn, bạn có fun acc el -> Array.append acc el trong đó có cùng loại và làm giống như Array.append, vì vậy bạn có thể rút ngắn nó để:

Array.fold Array.append [||] arr2d 
+1

Haskell guys gọi đó là phép biến đổi [eta reduction] (http://stackoverflow.com/questions/5793843/what-does-eta-reduce-mean-in-the- context-of-hlint). – scrwtp

+0

@scrwtp Không chỉ các bạn Haskell, đây là [tên lambda-calculus chuẩn cho nó] (https://en.wikipedia.org/wiki/Lambda_calculus#.CE.B7-conversion). –

+0

@AlexeyRomanov: có, nhưng chỉ Haskell guys gọi nó theo cách đó trong mở;) – scrwtp

Các vấn đề liên quan