3

私は Reactive Banana と呼ばれる Haskell FRP ライブラリの使用方法を学んでいますが、Haskell の一般的な使い方もかなり新しいものです。現在、ネットワークをパラメーターとして受け取る関数を作成しています。関数本体では、ネットワークをコンパイルしてそのイベントループを通過する前に初期化を行いますが、Haskell が何をしようとしているのかを推測できないという問題があります。行う。

ここにコードの縮小版があります

{-# LANGUAGE ScopedTypeVariables #-}

module Main where
import qualified Reactive.Banana as R
import qualified Reactive.Banana.Frameworks as RF

main = start setupNetwork

start :: forall t. RF.Frameworks t =>  R.Moment t () -> IO ()
start network = do
    net <- RF.compile $ network
    RF.actuate net

keyAddHandler = RF.newAddHandler

setupNetwork :: forall t. RF.Frameworks t => R.Moment t ()
setupNetwork = do
    (addKey, firekey) <- RF.liftIO keyAddHandler
    return ()

私が得ている正確なエラーはこれです。

Test.hs:11:25:
Could not deduce (t ~ t1)
from the context (RF.Frameworks t)
  bound by the type signature for
             start :: RF.Frameworks t => R.Moment t () -> IO ()
  at Test.hs:(10,1)-(12,18)
or from (RF.Frameworks t1)
  bound by a type expected by the context:
             RF.Frameworks t1 => R.Moment t1 ()
  at Test.hs:11:12-31
  `t' is a rigid type variable bound by
      the type signature for
        start :: RF.Frameworks t => R.Moment t () -> IO ()
      at Test.hs:10:1
  `t1' is a rigid type variable bound by
       a type expected by the context: RF.Frameworks t1 => R.Moment t1 ()
       at Test.hs:11:12
Expected type: R.Moment t1 ()
  Actual type: R.Moment t ()
In the second argument of `($)', namely `network'
In a stmt of a 'do' block: net <- RF.compile $ network

インターネットを検索すると、start 関数のフレームワークと setupNetwork 関数のフレームワークの間の型は同じ型とは見なされないと思います。

タイプを一致させる方法はありますか?

4

1 に答える 1

3

リアクティブバナナ(または型システムをプッシュする他のもの)をいじってからしばらく経ちましたが、型シグネチャはもっと似たものであるべきだと思います

start :: (forall t. RF.Frameworks t =>  R.Moment t ()) -> IO ()

(つまり、適切な場所に括弧を追加する必要があります。)

あなたも必要{-# LANGUAGE RankNTypes #-}になります。

于 2013-02-02T08:26:06.310 に答える