Trong Haskell, giống như trong nhiều ngôn ngữ chức năng khác, hàm foldl
được định nghĩa sao cho, ví dụ: foldl (-) 0 [1,2,3,4] = -10
.Tại sao nếp gấp được xác định theo cách lạ trong vợt?
Điều này là ổn, bởi vì foldl (-) 0 [1, 2,3,4]
, theo định nghĩa, ((((0 - 1) - 2) - 3) - 4)
.
Nhưng, trong Racket, (foldl - 0 '(1 2 3 4))
là 2, vì vợt "thông minh" tính toán như thế này: (4 - (3 - (2 - (1 - 0))))
, mà thực sự là 2.
Tất nhiên, nếu chúng ta định nghĩa phụ trợ chức năng lật, như thế này:
(define (flip bin-fn)
(lambda (x y)
(bin-fn y x)))
sau đó chúng ta có thể trong vợt đạt được các hành vi tương tự như trong Haskell: thay vì (foldl - 0 '(1 2 3 4))
chúng ta có thể viết: (foldl (flip -) 0 '(1 2 3 4))
câu hỏi đặt ra là: tại sao foldl
trong vợt được định nghĩa theo cách kỳ quặc (phi tiêu chuẩn và không trực quan), khác với bất kỳ ngôn ngữ nào khác?
FWIW, 'Left-left' của Chez Scheme phù hợp với những gì bạn mong đợi:' (fold-left - 0 '(1 2 3 4)) 'là' -10' và '(left-left cons'() ' (1 2 3 4)) 'là' (((((). 1). 2). 3). 4) '. – erjiang