Tôi đang cố gắng tìm một cách tốt để ghi nhớ một chức năng chỉ cho một phần của miền (số nguyên không âm) trong Haskell, sử dụng Data.MemoCombinators
.Ghi nhớ một phần trong Haskell
import Data.MemoCombinators
--approach 1
partFib n | n < 0 = undefined
| otherwise = integral fib n where
fib 0 = 1
fib 1 = 1
fib k = partFib (k-1) + partFib (k-2)
--approach 2
partFib2 n | n < 0 = undefined
| otherwise = fib n
fib = integral fib'
where
fib' 0 = 1
fib' 1 = 1
fib' n = partFib2 (n-1) + partFib2 (n-2)
Phương pháp tiếp cận 1 là cách tôi muốn thực hiện, tuy nhiên, dường như nó không hoạt động. Tôi cho rằng điều này là do hàm fib
được "tạo lại" mỗi khi partFib
được gọi, bỏ đi việc ghi nhớ. fib
không phụ thuộc vào đầu vào của partFib
, vì vậy bạn sẽ giả định rằng trình biên dịch có thể hoist nó, nhưng dường như GHC không hoạt động theo cách đó.
Cách tiếp cận 2 là cách tôi kết thúc. Eerk, rất nhiều hệ thống dây điện xấu xí.
Có ai biết cách nào tốt hơn để làm điều này không?
Cảm ơn, đây là tốt hơn so với những gì tôi đã có. Không có gì thực sự là "xấu xí" Tôi chỉ muốn định nghĩa trông giống như việc triển khai Fibonacci ngây thơ càng tốt. – dainichi
Tại sao điều này tạo nên sự khác biệt? Không phải 'f n = e' ngữ nghĩa chính xác giống như' f = \ n -> e'? –
@Dan, ngữ nghĩa, vâng. Nhưng việc ghi nhớ đang đi vào lãnh thổ hoạt động. Chữ 'n' trong phần trước được xếp chồng lên trên mệnh đề' where' trong khi 'n' trong mệnh đề thứ hai thì không, do đó thay đổi cách các khối trong mệnh đề where được chia sẻ. – luqui