返回类型上的IO丢失

保罗

我在此代码块中的功能共识方面遇到麻烦。共识的递归定义返回[Action]而不是IO [Action]

我是Haskell的新手,不明白为什么会这样。我的印象是,不可能从返回值中删除IO。

import System.Random (randomRIO)
import Data.Ord (comparing)
import Data.List (group, sort, maximumBy)

data Action = A | B deriving (Show, Eq, Ord)

-- Sometimes returns a random action
semiRandomAction :: Bool -> Action -> IO (Action)
semiRandomAction True a = return a
semiRandomAction False _ = do
  x <- randomRIO (0, 1) :: IO Int
  return $ if x == 0 then A else B

-- Creates a sublist for each a_i in ls where sublist i does not contain a_i
oneOutSublists :: [a] -> [[a]]
oneOutSublists [] = []
oneOutSublists (x:xs) = xs : map (x : ) (oneOutSublists xs)

-- Returns the most common element in a list
mostCommon :: (Ord a) => [a] -> a
mostCommon = head . maximumBy (comparing length) . group . sort

-- The function in question
consensus :: [Bool] -> [Action] -> IO [Action]
consensus [x] [action] = sequence [semiRandomAction x action]
consensus xs actions = do
  let xs' = oneOutSublists xs
      actions' = map (replicate $ length xs') actions
  replies <- mapM (uncurry $ consensus) (zip xs' actions')
  map mostCommon replies -- < The problem line

main = do
  let xs = [True, False, False]
      actions = [A, A, A]
  result <- consensus xs actions
  print result

ghc输出

➜  ~ stack ghc example.hs 
[1 of 1] Compiling Main             ( example.hs, example.o )

example.hs:29:3: error:
    • Couldn't match type ‘[]’ with ‘IO’
      Expected type: IO [Action]
        Actual type: [Action]
    • In a stmt of a 'do' block: map mostCommon replies
      In the expression:
        do let xs' = oneOutSublists xs
               actions' = map (replicate $ length xs') actions
           replies <- mapM (uncurry $ consensus) (zip xs' actions')
           map mostCommon replies
      In an equation for ‘consensus’:
          consensus xs actions
            = do let xs' = ...
                     ....
                 replies <- mapM (uncurry $ consensus) (zip xs' actions')
                 map mostCommon replies
   |
29 |   map mostCommon replies
   |   
DevNewb

我想你要找的是

return $ map mostCommon replies

return 是将值包装到monad中的标准函数。

您可以这样想:

  • 您在IO monad内部,因此GHC希望您的函数将返回 IO a
  • 你回来了[] Action(这只是另一种写作方式[Action]

所以这里有两个错误:

  • 您的实际返回类型与类型注释不匹配([Action]vs IO [Action]
  • 包装Action([]和期望IO的类型不匹配

return此处使用功能时,可以同时修复两个错误。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Typescript条件映射类型丢失返回类型信息

来自分类Dev

io-ts对象类型名称在WebStorm中丢失

来自分类Dev

Scala .map()信息丢失(由于返回类型与元素相同:Set)

来自分类Dev

避免在返回值中丢失类型信息

来自分类Dev

TcpStream上的std :: io :: BufReader会导致数据丢失吗?

来自分类Dev

返回父组件时,vue 动态组件上的数据丢失

来自分类Dev

返回上一页而不会丢失数据

来自分类Dev

为什么从函数返回联合类型时类型推断会丢失?

来自分类Dev

获取AC数组上begin的返回类型

来自分类Linux

Python在错误的行上返回类型错误

来自分类Dev

方法信息上的返回类型信息

来自分类Dev

泛型参数丢失类型安全性上的类型扩展

来自分类Dev

具体类型与返回类型上的接口不匹配

来自分类Dev

为什么在此示例中自动返回类型会丢失移动语义?

来自分类Dev

我可以在重写虚拟函数的返回类型中丢失“常数”吗?

来自分类Dev

STL算法返回类型强制转换,不会造成数据丢失

来自分类Dev

Silverstripe页面类型丢失

来自分类Dev

Haskell:如何检查IO上的运行时类型?

来自分类Dev

在 waituntil 方法 webdriver.io 上返回 true 或 false

来自分类Dev

Amazon EC2:如何更改实例类型而不会丢失附加的EBS卷上的数据

来自分类Dev

valarray上STL算法“ count”的返回类型是什么

来自分类Dev

Ajax调用返回json数据类型上的[object object]

来自分类Dev

错误:仅在返回类型上不同的函数无法重载

来自分类Java

使用`close()`或`shutdown()`方法在返回类型的bean上设置`destroyMethod`

来自分类Dev

如何在ProducesResponseType Swagger上返回泛型类型?

来自分类Dev

是否可以在PHP 7上指定多个返回类型?

来自分类Dev

通过在子类型上返回迭代器来实现Iterable

来自分类Java

是否可以在返回类型上添加注释

来自分类Dev

Typescript在HTTP请求上设置返回类型的正确方法

Related 相关文章

  1. 1

    Typescript条件映射类型丢失返回类型信息

  2. 2

    io-ts对象类型名称在WebStorm中丢失

  3. 3

    Scala .map()信息丢失(由于返回类型与元素相同:Set)

  4. 4

    避免在返回值中丢失类型信息

  5. 5

    TcpStream上的std :: io :: BufReader会导致数据丢失吗?

  6. 6

    返回父组件时,vue 动态组件上的数据丢失

  7. 7

    返回上一页而不会丢失数据

  8. 8

    为什么从函数返回联合类型时类型推断会丢失?

  9. 9

    获取AC数组上begin的返回类型

  10. 10

    Python在错误的行上返回类型错误

  11. 11

    方法信息上的返回类型信息

  12. 12

    泛型参数丢失类型安全性上的类型扩展

  13. 13

    具体类型与返回类型上的接口不匹配

  14. 14

    为什么在此示例中自动返回类型会丢失移动语义?

  15. 15

    我可以在重写虚拟函数的返回类型中丢失“常数”吗?

  16. 16

    STL算法返回类型强制转换,不会造成数据丢失

  17. 17

    Silverstripe页面类型丢失

  18. 18

    Haskell:如何检查IO上的运行时类型?

  19. 19

    在 waituntil 方法 webdriver.io 上返回 true 或 false

  20. 20

    Amazon EC2:如何更改实例类型而不会丢失附加的EBS卷上的数据

  21. 21

    valarray上STL算法“ count”的返回类型是什么

  22. 22

    Ajax调用返回json数据类型上的[object object]

  23. 23

    错误:仅在返回类型上不同的函数无法重载

  24. 24

    使用`close()`或`shutdown()`方法在返回类型的bean上设置`destroyMethod`

  25. 25

    如何在ProducesResponseType Swagger上返回泛型类型?

  26. 26

    是否可以在PHP 7上指定多个返回类型?

  27. 27

    通过在子类型上返回迭代器来实现Iterable

  28. 28

    是否可以在返回类型上添加注释

  29. 29

    Typescript在HTTP请求上设置返回类型的正确方法

热门标签

归档