2012-06-21 20 views
7

Tôi gặp vấn đề khi xem xét tham số ngầm trong Haskell (GHC). Tôi có một chức năng f, rằng giả định các tham số ngầm x, và muốn đóng gói nó trong một bối cảnh bằng cách áp dụng f-gTham số và chức năng ngầm định

f :: (?x :: Int) => Int -> Int 
f n = n + ?x 

g :: (Int -> Int) -> (Int -> Int) 
g t = let ?x = 5 in t 

Nhưng khi tôi cố gắng để đánh giá

g f 10 

tôi nhận được một lỗi mà x không bị ràng buộc, ví dụ:

Unbound implicit parameter (?x::Int) 
    arising from a use of `f' 
In the first argument of `g', namely `f' 
In the second argument of `($)', namely `g f 10' 

Ai đó có thể cho tôi biết, tôi đang làm gì sai?

(tôi đang cố gắng để có được giao diện WordNet cho Haskell làm việc - http://www.umiacs.umd.edu/~hal/HWordNet/ - và nó sử dụng trên các thông số ngầm theo cách thức trên, và tôi tiếp tục nhận lỗi mô tả nêu trên khi tôi cố gắng để biên dịch nó)

Trả lời

1

Mã này hoạt động tốt, nhưng hãy chắc chắn bạn thực sự kích hoạt phần mở rộng của tham số Implicit!

Ví dụ, ở phía trên cùng của .hs bạn nộp bạn nên bao gồm:

{-# LANGUAGE ImplicitParams #-} 

Hoặc bạn có thể sử dụng -XImplicitParams cờ mỗi khi bạn chạy GHC.

EDIT: Bạn đang nói điều này không phù hợp với bạn?

dyn-40-155:Test tommd$ cat so.hs 
{-# LANGUAGE ImplicitParams #-} 

f :: (?x :: Int) => Int -> Int 
f n = n + ?x 

g :: (Int -> Int) -> (Int -> Int) 
g t = let ?x = 5 in t 
dyn-40-155:Test tommd$ ghci so.hs 
GHCi, version 7.4.1: http://www.haskell.org/ghc/ :? for help 
Loading package ghc-prim ... linking ... done. 
Loading package integer-simple ... linking ... done. 
Loading package base ... linking ... done. 
[1 of 1] Compiling Main    (so.hs, interpreted) 
Ok, modules loaded: Main. 
*Main> g (*3) 4 
12 

Nếu điều đó không hoạt động thì tôi nghi ngờ bạn cài đặt GHC kém.

+0

Xin chào, tôi có '{- # LANGUAGE ImplicitParams # -}' i đầu tệp của tôi, nhưng nó vẫn mang lại cùng một lỗi. Bất kỳ đề xuất? PS: Tôi sử dụng GHC ver. 7.4.1 – niklascp

+0

Xem chỉnh sửa của tôi. Tôi sao chép và dán mã của bạn và thêm 'pragma' LANGUAGE', hoạt động tốt. Nó cũng có tác dụng với bạn. Nếu điều này làm việc nhưng trường hợp mở rộng của bạn không (HWordNet) thì đó là một vấn đề riêng biệt. –

+0

Xin chào, cảm ơn bạn đã cập nhật - Tôi có thể đánh giá 'g (* 3) 4' mà không gặp vấn đề gì, tuy nhiên tôi không thể đánh giá' g f 4' như tôi mong đợi - có thể không? – niklascp

4

Vấn đề ở đây là ?x không bị ràng buộc tại điểm được tham chiếu. Bạn và tôi có thể thấy rằng ?x sẽ bị ràng buộc trong phạm vi g, nhưng trình biên dịch không thể. One (khó hiểu) giải pháp là thay đổi

g f 10 

để

g (let ?x = 5 in f) 10 
5

Tham số đầu tiên của g phải loại ((?x::Int) => Int -> Int) làm rõ rằng? X phải được chuyển vào f. Điều này có thể dony được cho phép Rank2Types (hoặc RankNTypes). Thật không may, GHC không thể suy ra loại này.

{-# LANGUAGE ImplicitParams #-} 
{-# LANGUAGE Rank2Types #-} 

f :: (?x::Int) => Int -> Int 
f n = n + ?x 

g :: ((?x::Int) => Int -> Int) -> (Int -> Int) 
g f = let ?x = 5 in f` 

Hiện tại g f 10 hoạt động.