haskell - 使用修改和放置时字符串、列表的 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 ()
感谢您的帮助。
解决方案
如错误所示,您需要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>
推荐阅读
- c# - EPPlus - 创建和验证数字签名
- azure - 调用 TelemetryClient.TrackEvent() 后是否保证交付 Azure Application Insights 自定义事件?
- angular - 我们可以从另一个子组件访问一个子组件中的变量吗?
- reactjs - 如何在 Github Page 中使用环境变量?
- algorithm - 选择最小数量篮子的算法策略
- javascript - 无法将作为参数传递给每个 jQuery 的对象数组的值附加到 html 元素
- javascript - 如何在 ReactJS 中的子组件(兄弟姐妹)之间共享状态?
- python-3.x - 如何创建可以运行存储在文件夹中的其他 python 文件的 Python 可执行文件?
- javascript - 具有非时间 x 轴的 D3 多系列折线图
- angular - 无法在 Angular 7 中设置嵌入式报表的配置设置