我試着用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 #-}
它廁所ks懷疑GHC重新編譯所有模塊,因爲'[flags changed]'。知道現在丟失的「節儉」標誌是什麼讓我們感興趣。 –
@DanielFischer我用已找到的編譯標誌更新了我的問題。你怎麼看? – mre
嗯,'-fno-warn-xyz'不應該被認爲是需要重新編譯的標誌改變。 'thrift --gen hs shared.thrift'可以在詳細模式下運行,並且可以調出GHC調用嗎? –