如何在haskell中正确返回嵌套类型



如果其中一个参数为Nothing,我想返回空列表,但我不能

data UtilsDiff = UtilsDiff {syntaxBlockOptions :: [String], optionsBlockOptions :: [String]}
deriving Show

data UtilsOrDiff = UtilsOrDiff Utils | Diff UtilsDiff
deriving Show
useBlockExpr :: Parser UtilsOrDiff
useBlockExpr = do
u1 <- syntaxExpr
opts <- optionsBlockExpr
_ <- absorbToStopWord "Description:"
utilDesc <- many anyChar
case options u1 of
Nothing -> Diff [] [] -- <- this line
Just val-> do
...

显然,我还没有弄清楚如何返回Diff类型的

warning: [-Wdeferred-type-errors]     
• Couldn't match expected type ‘[a0] -> Text.Parsec.Prim.ParsecT String () Data.Functor.Identity.Identity UtilsOrDiff’ with actual type ‘UtilsOrDiff’
• The function ‘Diff’ is applied to two value arguments,but its type ‘UtilsDiff -> UtilsOrDiff’ has only one 
In the expression: Diff [] [] In a case alternative: Nothing -> Diff [] []

Diff的类型为UtilsDiff -> UtilsOrDiff,而不是[a] -> [a] -> UtilsDiff。您需要首先创建UtilsDiff值,然后使用来创建Diff值。

Nothing -> return $ Diff (UtilsDiff [] [])

由于Just分支估计为Parser UtilsOrDiff值,因此Nothing分支也必须如此,因此调用return

最新更新