11

Haskell(GHC)の暗黙のパラメーターを検討する際に問題があります。暗黙のパラメータxを想定する関数fがあり、 fgに適用してコンテキストにカプセル化したいと考えています。

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

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

しかし、私が評価しようとすると

g f 10

xがバインドされていないというエラーが表示されます。例:

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'

誰かが私に、私が間違っていることを教えてもらえますか?

(私はHaskellのWordNetインターフェースを機能させようとしています-http ://www.umiacs.umd.edu/~hal/HWordNet/-そしてそれは上記の方法で暗黙のパラメーターを使用します、そして私はエラーを次のように受け取り続けます私がそれをコンパイルしようとすると上記の1つ)

4

2 に答える 2

8

の最初のパラメーターは、?x を に渡す必要があることを明確にするためgの型でなければなりません。これは、Rank2Types (または RankNTypes) を有効にしなくてもかまいません。残念ながら、GHC はこの型を推測できません。((?x::Int) => Int -> Int)f

{-# 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`

今すぐg f 10動作します。

于 2013-08-28T12:06:11.743 に答える
6

ここでの問題は、?x参照された時点でバインドされていないことです。?xあなたと私はそれが 内でバインドされることがわかりますgが、コンパイラはできません。1 つの (紛らわしい) 解決策は、変更することです。

g f 10

g (let ?x = 5 in f) 10
于 2013-05-01T06:45:32.710 に答える