2010-05-10 46 views
11
21 --Primitive recursion constructor 
22 pr :: ([Int] -> Int) -> ([Int] -> Int) -> ([Int] -> Int) 
23 pr f g = \xs 0 -> f xs 
24 pr f g = \xs (y+1) -> g xs y ((pr f g) xs y) 

Tôi muốn hàm này tạo ra hoạt động khác nhau trên các đầu vào khác nhau để có thể tạo hàm đệ quy. Như dự kiến, mã trên không hoạt động. Làm thế nào để làm một cái gì đó như phù hợp với mô hình, nhưng đối với chức năng nó tạo ra?Đối sánh mẫu cho biểu thức lambda

Cảm ơn

Trả lời

20
pr f g = \xs y' -> case y' of 0  -> f xs 
           (y+1) -> g xs y ((pr f g) xs y) 

hoặc đơn giản là

pr f g xs 0 = f xs 
pr f g xs (y+1) = g xs y ((pr f g) xs y) 

(Hãy nhớ rằng f a b = ... cơ bản là một phím tắt cho f a = \b -> ... mà là một phím tắt cho f = \a -> \b -> ....)

Lưu ý rằng n + 1 mẫu là không được chấp nhận và loại bạn đã chỉ định cho pr không khớp với định nghĩa (và của tôi) của bạn.

Cụ thể theo loại của bạn, hàm cần [Int] -> Int (f), sau đó một hàm khác mất [Int] -> Int (g), sau đó một hàm mất [Int] (xs) và sau đó trả về Int. Tuy nhiên bạn gọi g với ba đối số và hàm cuối cùng mà bạn trả về có hai đối số, vì vậy có lẽ bạn muốn một cái gì đó như ([Int] -> Int) -> ([Int] -> Int -> Int -> Int) -> [Int] -> Int -> Int.

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