首页 > 解决方案 > 使用修改和放置时字符串、列表的 MonadState 问题

问题描述

我正在尝试使用 MonadState monad,尤其是使用“修改”功能。

当我尝试

f :: (MonadState s m, Num s) => m ()
f = put 1

它可以正常工作,但是当我尝试将 State 设置为 String、Char 或 List 时,我收到此错误:

• Non type-variable argument in the constraint: MonadState Char m
  (Use FlexibleContexts to permit this)
• When checking the inferred type
    a :: forall (m :: * -> *). MonadState Char m => m ()

同样的情况发生在:

b = modify (1:)

• Non type-variable argument in the constraint: MonadState [a] m
  (Use FlexibleContexts to permit this)
• When checking the inferred type
    b :: forall a (m :: * -> *). (MonadState [a] m, Num a) => m ()

感谢您的帮助。

标签: haskellstatemonads

解决方案


如错误所示,您需要FlexibleContexts在 Haskell 中启用扩展才能运行它。您可以通过在文件顶部添加语言编译指示来做到这一点:

{-# LANGUAGE FlexibleContexts #-}

b = modify (1:)

或者,如果您与您一起使用以下标志ghci启用此扩展:-XFlexibleContexts

$ ghci -XFlexibleContexts
GHCi, version 8.6.5: http://www.haskell.org/ghc/  :? for help
Prelude> import Control.Monad.State.Class
Prelude Control.Monad.State.Class> b = modify (1:)
Prelude Control.Monad.State.Class> 

推荐阅读