2013-02-02 4 views
3

나는 Reactive Banana라고 불리는 Haskell FRP 라이브러리를 사용하는 법을 배우고 있으며 일반적으로 하스켈도 상당히 새롭다. 현재 매개 변수로 네트워크를 사용하는 함수를 만들고 함수 본문에서 네트워크를 컴파일하고 이벤트 루프를 통과하기 전에 초기화 작업을 수행하지만 Haskell이 내가 시도하고있는 것을 추론 할 수없는 문제가 있습니다. 할 것.하스켈은 컨텍스트 (프레임 t)에서 추론 할 수 없다. (프레임 워크 t)

는 여기에 내가 이쪽 무엇입니까 코드

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

은 스타트 기능의 프레임 워크와 setupnetwork를 함수의 프레임 워크 사이의 유형이 동일한 유형으로 간주되지 않습니다 있는게 틀림 없어.

어쨌든 유형을 일치시킬 수 있습니까?

답변

3

내가 반응 바나나 (또는 ​​너무 많은 종류의 시스템을 밀어 다른 것) 주위에 해본 적이 이후 오랜만이야,하지만 난 (유형 서명이 뭔가 더 같은

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

해야한다고 생각 즉, 올바른 위치에 괄호를 추가해야합니다.)

{-# LANGUAGE RankNTypes #-}도 필요합니다.

+0

다시 컴파일 작업이 완료되었습니다. 부수적으로, rank2types 및 scopedtypevariables와 같은 컴파일러 플래그를 사용하는 것은 나쁜 형식으로 간주됩니까? – chanko08

+1

확장에 따라 다릅니다. 'Rank2Types'가 필요하다면 주위를 돌아 다니지 않아도됩니다 : 그것을 사용해야합니다. 다른 한편, ScopedTypeVariables는 항상 엄격하게 필요한 것은 아니며, 당신이 그것을 피해야한다고 말하는 사람들이 있습니다 ... 그러나 일반적으로 사람들이 코드를 더 명확하게 만들면 그것을 사용한다고 말할 것입니다. – dave4420

+0

@ chanko08'Rank2Types'가'RankNTypes'에 찬성하여 단계적으로 사라지고 있다고 들었지만, 대신 그것을 사용하십시오. – dave4420