Haskell:检查IO的长度[Double]

时间:2014-11-11 00:32:05

标签: haskell monads functor

给定类型IO [Double]的列表,我希望能够检查列表是否具有所需的长度。

我猜我需要在这里使用仿函数,但我不明白如何定义它。我是否编写了长度函数的仿函数实例?或者我是否编写了一个使用fmap中的长度函数的数据类型的仿函数实例?

Monads,仿函数等对我来说都很新鲜。

3 个答案:

答案 0 :(得分:10)

类型IO [Double]的值没有长度,因为它不是双打列表,而是IO动作,执行时将生成双打列表。因此,编写IO [a] -> Int类型的函数是不可能的。

但是,您可以轻松编写IO [a] -> IO Int类型的函数,这与fmap length一样简单。

答案 1 :(得分:3)

最有可能的是,您要做的是获取列表,然后计算它的长度。通常,您需要使用符号表示(尽管并非绝对必要)。

Haskell封装了IO monad中的所有IO,因此您只能从另一个IO [Double]对象中的IO a获取列表。代码看起来像这样 -

main::IO ()
main = do
  theList <- getList --or whatever your object of type IO [Double] is
  let theLength = length theList
  ....  -- Do stuff with theLength here

答案 2 :(得分:1)

到目前为止发布的两个答案都是正确的,也是解决这个问题的好方法,但我想指出第三种语法来达到同样的效果。这实际上是jamshidh's answer减去do的句法糖 - 符号:

ioLength :: IO [Double] -> IO Int
ioLength a = a >>= (\x -> return $ length x)

或者,更简洁:

ioLength a = a >>= (return . length)

如果进一步浓缩,则产生amalloy's answer

ioLength = fmap (length)