2011-12-19 35 views
6

Tôi muốn viết một mô-đun sử dụng một chức năng được xác định bởi người dùng. Ví dụ:chức năng bên ngoài trong haskell?

module A 
(someFun) where 

someFun x = doSomethingWith externFun x 

Tôi muốn người dùng định nghĩa externFun, trong tệp nhập mô-đun A. Có cách nào không? Hay nó chỉ là một ý tưởng tồi?

Tất nhiên tôi có thể chuyển externFun làm đối số cho someFun, nhưng ở đó không có vẻ rất tiện lợi: hàm được truyền sẽ giống nhau cho mỗi cuộc gọi đến someFun.

+1

Một số nhận xét từ trình gỡ xuống sẽ giúp ích rất nhiều –

Trả lời

8

Các câu trả lời khác là sai: nó có thể! Có một phần mở rộng được sử dụng ít được gọi là ImplicitParams được tạo chính xác để thực hiện việc này. Ví dụ:

-- A.hs 
{-# LANGUAGE ImplicitParams #-} 
module A where 
someFun x = ?externFun (?externFun x) 

-- B.hs 
{-# LANGUAGE ImplicitParams #-} 
module B where 
import A 
main = print (someFun 3) where 
    ?externFun = (2*) 

Trong ghci:

Prelude *B> main 
12 

Voila! Thông tin khác trong số Hugs manual, số GHC manualImplicit Parameters: Dynamic Scoping with Static Types (PDF).

+0

Cảm ơn bạn. Đó là một cách tốt và haskelly để đi? Có những nhược điểm của việc sử dụng nó vượt qua các chức năng như một tham số (về thiết kế hoặc hiệu quả)? –

+0

@flagadabla Tôi nghĩ rằng nó không phải là rất phổ biến, nhưng tôi không biết bất kỳ mối quan tâm thiết kế hoặc hiệu quả để được cảnh giác so với đi qua trong một chức năng một cách rõ ràng. –

0

Không, bạn nên thực hiện như một đối số. Tại sao bạn nghĩ rằng nó sẽ giống nhau cho mỗi cuộc gọi? Nó hoạt động giống như bất kỳ đối số nào khác.

6

Không, bạn không thể thực hiện việc này. Vượt qua nó như một đối số là con đường để đi. Tuy nhiên, bạn có thể loại bỏ sự lặp lại bằng cách sử dụng một phần ứng dụng. Chỉ cần làm điều gì đó như thế này trong mô-đun khác:

import A (someFun) 
someFun' = someFun externFun 

Bây giờ bạn có thể sử dụng someFun' ở mọi nơi thay thế.

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