Haskell Chart中断堆栈构建

时间:2019-03-26 14:03:14

标签: haskell haskell-stack haskell-chart

尝试使用Chart学习Haskell。打包时使用以下代码进行破坏:

/private/var/folders/m2/qwhdrn_d46z99_3vxchdwn7r0000gn/T/stack5630/Chart-1.9/Graphics/Rendering/Chart/State.hs:102:3: error:
    • No instance for (Control.Monad.Fail.MonadFail Identity)
        arising from a do statement
        with the failable pattern ‘(c : cs)’
    • In a stmt of a 'do' block: (c : cs) <- use shapes
      In the second argument of ‘($)’, namely
        ‘do (c : cs) <- use shapes
            shapes .= cs
            return c’
      In the expression:
        liftCState
          $ do (c : cs) <- use shapes
               shapes .= cs
               return c
    |
102 |   (c:cs) <- use shapes

我太缺乏经验了,不知道该如何处理这样的问题。请告知。

1 个答案:

答案 0 :(得分:1)

您可以选择一些方法来解决该问题。您正在尝试使用非穷举模式在'do'块中进行模式匹配。为此:

  • 您可以禁用MonadFailDesugaring扩展。在文件顶部添加{-#LANGUAGE NoMonadFailDesugaring#-}或使用标志-XNoMonadFailDesugaring进行编译。但是此扩展不能在以后的GHC 8.8或更高版本中停用。

  • 您可以定义或派生MonadFail实例。

  • 您可以使用State monad。如果monad变压器堆栈中较低的monad是MonadFail的实例,那么我们也可以使最高的monad成为MonadFail的实例。

  • 停止,并执行显式和详尽的模式匹配。

来源:http://www.fyrbll.me/haskell/language-extensions/monad-fail-desugaring/processed.html