2016-02-09 10 views
5

Haskellの関数アプリケーション( "space"演算子)が言語に焼き付けられたのではなく、型クラスにあったとします。私はそれがf $ aにdesugarう関数アプリケーションがtypeclassの場合はどうなりますか?

class Apply f where 
    ($) :: f a r -> a -> r 

instance Apply (->) where 
    ($) = builtinFnApply# 

そしてf aようになります想像してみてください。アイデアは、これはあなたがすなわち

instance Apply LinearMap where 
    ($) = matrixVectorMult 

というように、関数のように作用する他のタイプを定義しましょうということです。

これは型推論を確定できませんか?私の本能はそれがそうだと言っていますが、タイプ推論の私の理解は単純なヒンドレーミルナーで終わります。フォローアップとして、である場合、特定の病理学的事例を禁止することによって決定可能にすることはできますか?

答えて

5

これをHaskellの上に構文上の砂糖として想像することができれば(なぜなら、あなたはあなたのものに「スペース演算子」を置き換える)、なぜこれが型推論をそれより悪くするべきかわかりません。

しかし、この変更によりコードがより曖昧になることがあります。 get上記

class C a where get :: a 
instance C (Int -> Int) where get = id 
instance C Linearmap where get = ... 

test = get (5 :: Int) -- actually being (get $ (5 :: Int)) 

、このような曖昧さは、プレーンHaskellで発生しませんが、両方のインスタンスから取り出すことができます。

関連する問題