2012-04-16 42 views
5

phép nói rằng tôi có như sau:'seq` về chức năng áp dụng một phần

f :: a -> b -> c 
g :: b -> c 
g = f 10 

Bây giờ cho phép nói f thực sự là:

f x y = f1 x + y 

Sẽ:

g `seq` ... 

thực sự đánh giá f1 10 , vì vậy sau này khi chạy

g 9 

nó thực sự chỉ là một bổ sung đơn giản?

Nếu không, có cách nào để "đánh giá" các phần của hàm được áp dụng một phần không?

Tôi đang tìm một giải pháp chung, một giải pháp không phụ thuộc vào việc biết cách hoạt động của fg.

Trả lời

3

seq là nông cạn:

Prelude> let f1 = undefined 
Prelude> let f = \x -> \y -> f1 x + y 
Prelude> let g = f 10 
Prelude> g `seq` 1 
1 
Prelude> g 9 
*** Exception: Prelude.undefined 
Prelude> 

tôi muốn có một cái nhìn tại Control.DeepSeq: http://hackage.haskell.org/packages/archive/deepseq/1.2.0.1/doc/html/Control-DeepSeq.html

+0

tôi không giống như tôi có thể áp dụng 'deepseq' chức năng. – Clinton

+0

Không, có vẻ như nó chỉ áp dụng cho các cấu trúc dữ liệu đưa DeepSeq vào tài khoản. Không phải là một giải pháp cho vấn đề của bạn như đã nêu. – Deestan

9

Không, nó sẽ không, bởi vì nói chung, sự lựa chọn của phía bên tay phải cho f có thể phụ thuộc vào y. Nếu bạn muốn chia sẻ kết quả của f1 x giữa các cuộc gọi đến g, bạn sẽ phải viết f như thế này:

f x = let z = f1 x in \y -> z + y 

Tất nhiên, do lười biếng này sẽ không đánh giá f1 x cho đến khi lần đầu tiên g được gọi. Để có g `seq` ... đánh giá sức mạnh của f1 x, bạn sẽ phải viết:

f x = let z = f1 x in z `seq` (\y -> z + y) 
Các vấn đề liên quan