首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >无论是过滤器还是filterM -布尔值与IO布尔值的差异

无论是过滤器还是filterM -布尔值与IO布尔值的差异
EN

Stack Overflow用户
提问于 2019-09-16 01:53:03
回答 1查看 128关注 0票数 1

我正在尝试过滤掉那些包含斜杠的字符串:

代码语言:javascript
代码运行次数:0
运行
复制
import Data.List
import Control.Monad(filterM)

hasSlash :: [Char] -> Bool
hasSlash firline = do
    isInfixOf "/" firline

main :: IO ()
main = do
    let d = ["abcd","abc/d","a/bcd","abcd","ab/cd"]
    -- filter out those that do not have '/'
    e <- filterM hasSlash d
    print e

但是,我得到了以下错误:

代码语言:javascript
代码运行次数:0
运行
复制
soq_filter.hs:13:18: error:
    • Couldn't match type ‘Bool’ with ‘IO Bool’
      Expected type: [Char] -> IO Bool
        Actual type: [Char] -> Bool
    • In the first argument of ‘filterM’, namely ‘hasSlash’
      In a stmt of a 'do' block: e <- filterM hasSlash d
      In the expression:
        do { let d = ...;
             e <- filterM hasSlash d;
             print e }

问题在哪里?如何解决?谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-09-16 01:55:33

您不需要也不想要IO或任何其他monad来进行过滤。改为执行以下操作:

代码语言:javascript
代码运行次数:0
运行
复制
import Data.List

hasSlash :: [Char] -> Bool
hasSlash firline = isInfixOf "/" firline

main :: IO ()
main = do
    let d = ["abcd","abc/d","a/bcd","abcd","ab/cd"]
    -- filter out those that do not have '/'
    let e = filter hasSlash d
    print e

请注意,为了避免需要一元上下文,使用了let e =而不是e <-

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57946743

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档