给定类型IO [Double]
的列表,我希望能够检查列表是否具有所需的长度。
我猜我需要在这里使用仿函数,但我不明白如何定义它。我是否编写了长度函数的仿函数实例?或者我是否编写了一个使用fmap
中的长度函数的数据类型的仿函数实例?
Monads,仿函数等对我来说都很新鲜。
答案 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)