2013-06-21 32 views
0

我試着用ghc 7.6.3到 從thrift-0.9.0/tutorial/hs編譯HaskellServer.hs文件無濟於事。用GHC編譯節儉教程的問題7.6.3

在命令行我叫

節儉--gen HS tutorial.thrift

節儉--gen HS shared.thrift

其中沒有任何錯誤的工作。

在那之後,我試着用

GHC HaskellServer.hs

編譯,但我得到了下面的錯誤輸出:

[1 of 7] Compiling Shared_Types  (Shared_Types.hs, Shared_Types.o) [flags changed] 
[2 of 7] Compiling SharedService_Iface (SharedService_Iface.hs, SharedService_Iface.o) [flags 
changed] 
[3 of 7] Compiling SharedService (SharedService.hs, SharedService.o) [flags changed] 
[4 of 7] Compiling Tutorial_Types (Tutorial_Types.hs, Tutorial_Types.o) [flags changed] 
[5 of 7] Compiling Calculator_Iface (Calculator_Iface.hs, Calculator_Iface.o) [flags changed] 
[6 of 7] Compiling Calculator  (Calculator.hs, Calculator.o) [flags changed] 
[7 of 7] Compiling Main    (HaskellServer.hs, HaskellServer.o) 

HaskellServer.hs:48:33: 
    Couldn't match type `GHC.Int.Int32' with `Int' 
    Expected type: Maybe Int 
     Actual type: Maybe GHC.Int.Int32 
    In the first argument of `fromJust', namely `k' 
    In the second argument of `(!)', namely `(fromJust k)' 
    In the second argument of `($)', namely `(myLog ! (fromJust k))' 

HaskellServer.hs:73:60: 
    Couldn't match type `Int' with `GHC.Int.Int32' 
    Expected type: Maybe GHC.Int.Int32 
     Actual type: Maybe Int 
    In the `f_InvalidOperation_what' field of a record 
    In the second argument of `($)', namely 
     `InvalidOperation 
     {f_InvalidOperation_what = Just $ fromEnum $ op work, 
      f_InvalidOperation_why = Just "Cannot divide by 0"}' 
    In the expression: 
     throw 
     $ InvalidOperation 
      {f_InvalidOperation_what = Just $ fromEnum $ op work, 
      f_InvalidOperation_why = Just "Cannot divide by 0"} 

HaskellServer.hs:74:64: 
    Couldn't match expected type `Data.Text.Lazy.Internal.Text' 
       with actual type `[Char]' 
    In the first argument of `Just', namely `"Cannot divide by 0"' 
    In the `f_InvalidOperation_why' field of a record 
    In the second argument of `($)', namely 
     `InvalidOperation 
     {f_InvalidOperation_what = Just $ fromEnum $ op work, 
      f_InvalidOperation_why = Just "Cannot divide by 0"}' 

HaskellServer.hs:79:53: 
    Couldn't match type `[Char]' with `Data.Text.Lazy.Internal.Text' 
    Expected type: Data.Text.Lazy.Internal.Text 
     Actual type: String 
    In the return type of a call of `show' 
    In the first argument of `Just', namely `(show val)' 
    In the second argument of `SharedStruct', namely 
     `(Just (show val))' 

HaskellServer.hs:80:52: 
    Couldn't match expected type `Int' with actual type `GHC.Int.Int32' 
    In the first argument of `M.insert', namely `logid' 
    In the second argument of `(.)', namely `(M.insert logid logEntry)' 
    In the second argument of `($)', namely 
     `return . (M.insert logid logEntry)' 

顯然,什麼是錯的同類型但我不能說我的具體 GHC版本或節儉本身是否有問題。

下面是第一錯誤信息的代碼(HaskellServer.hs:48:33):

instance SharedService_Iface CalculatorHandler where 
    getStruct self k = do 
    myLog <- readMVar (mathLog self) 
    return $ (myLog ! (fromJust k)) 

有人可以指向我在正確的方向?


更新

生成的節儉文件列出所使用的編譯標誌:

{-# OPTIONS_GHC -fno-warn-name-shadowing #-} 
{-# OPTIONS_GHC -fno-warn-unused-imports #-} 
{-# OPTIONS_GHC -fno-warn-unused-matches #-} 
{-# OPTIONS_GHC -fno-warn-missing-fields #-} 
{-# OPTIONS_GHC -fno-warn-missing-signatures #-} 
+0

它廁所ks懷疑GHC重新編譯所有模塊,因爲'[flags changed]'。知道現在丟失的「節儉」標誌是什麼讓我們感興趣。 –

+0

@DanielFischer我用已找到的編譯標誌更新了我的問題。你怎麼看? – mre

+0

嗯,'-fno-warn-xyz'不應該被認爲是需要重新編譯的標誌改變。 'thrift --gen hs shared.thrift'可以在詳細模式下運行,並且可以調出GHC調用嗎? –

回答

1

很難知道什麼類型的,你沒有看到更多的代碼的實際使用,但我有預感到節儉產生的東西,期望GHC.Int.Int32,而你的代碼期望Int

+0

可能就是這樣。所有代碼都來自thrift軟件包附帶的官方教程。也許Haskell教程已過時? – mre