所以我想我会有一些有趣的分析一些AIS数据与回旋镖,我是绊脚石在第一个障碍。编译错误令人困惑。在我试图解决这个问题之前,我已经解析了类似的东西。
图书馆很简单。我定义了一些基本类型及其解析器/语法:
import Control.Category (id, (.))
import Control.Monad (forever)
import Prelude hiding (id, (.))
import System.IO (hFlush, stdout)
import Text.Boomerang
import Text.Boomerang.String
import Text.Boomerang.TH
data MessageType = AIVDM | AIVDO deriving (Enum, Eq, Show)
data AIS = AIS {
msgType :: MessageType
} deriving (Eq, Show)
$(makeBoomerangs ''MessageType)
$(makeBoomerangs ''AIS)
messageTypeP :: StringBoomerang () (MessageType :- ())
messageTypeP = rAIVDM . "!AIVDM" <> rAIVDO . "!AIVDO"
aisP :: StringBoomerang () (AIS :- ())
aisP = rAIS . messageTypeP . lit ","现在,我希望支持在消息类型之后出现的句子计数值;我将一个Int添加到AIS
data AIS = AIS {
msgType :: MessageType, sCount :: Int
} deriving (Eq, Show)并更改解析器/打印机:
aisP :: StringBoomerang () (AIS :- ())
aisP = rAIS . messageTypeP . lit "," . int但它未能编译:
• Couldn't match type ‘()’ with ‘Int :- ()’
Expected type: Boomerang
StringError String () (MessageType :- (Int :- ()))
Actual type: Boomerang StringError String () (MessageType :- ())
• In the second argument of ‘(.)’, namely
‘messageTypeP . lit "," . int’
In the expression: rAIS . messageTypeP . lit "," . int
In an equation for ‘aisP’:
aisP = rAIS . messageTypeP . lit "," . int唉哟。救命求你了?
发布于 2017-05-05 13:59:05
回旋镖应该是多态的。
messageTypeP :: StringBoomerang r (MessageType :- r)
aisP :: StringBoomerang r (AIS :- r)其解释是,r是一堆类型,而回旋镖则是从/推到它的pop/push类型。将r设置为()强制输入堆栈为空,这会损害这些回旋镖的可重用性。
https://stackoverflow.com/questions/43803875
复制相似问题