错误来自于read x
类型为Double
而不是[Double]
,但是就其本身而言,即使使用该修补程序,您的功能也无法正常工作。
让我们把你的函数放到单词中:“把字符串列表的前面的元素作为一个double来读取,然后对列表的其余部分做同样的处理”。现在让我们来看看你的功能:
stringToDouble :: [String] -> [Double]
stringToDouble [] = error "empty list"
stringToDouble [x] = read x :: Double -- Error
stringToDouble (x:xs) = stringToDouble xs
现在让我们将修复应用到它。另外,没有理由在空列表中出错。只是产量和空的双打名单:
stringToDouble :: [String] -> [Double]
stringToDouble [] = []
stringToDouble [x] = [read x :: Double] -- Put the single value into a list
stringToDouble (x:xs) = stringToDouble xs
问题在于递归步骤。在列表上调用stringToDouble
与在列表的尾部调用stringToDouble
相同。第一个元素简单地被丢弃。您想要转换头并将其放回列表中。
stringToDouble :: [String] -> [Double]
stringToDouble [] = []
stringToDouble [x] = [read x :: Double] -- Put the single value into a list
stringToDouble (x:xs) = (read x :: Double) : stringToDouble xs
哪里(:)
是用于将元件连接到列表中的正面的操作员。因此,甚至不需要中间线,因为递归步骤将处理转换,空列表步骤将处理停止条件。
stringToDouble :: [String] -> [Double]
stringToDouble [] = []
stringToDouble (x:xs) = (read x :: Double) : stringToDouble xs
现在,实事求是,你可以可能删除:: Double
部分和Haskell会找出你的意思与功能的类型约束,但它不会伤害,有时它有助于可读性离开它英寸
非常感谢您的支持。你有什么建议,如果我有这样的列表'[“a”,“1.2”]'..我怎样才能使用数字而不是单词,以便“a”会被忽略?通过正则表达式可能? – letsjak 2014-11-23 23:50:58
你是什么意思“被忽略”?你想要发生什么事情,非数字?你不能在Haskell中有一个异类列表,所以你不能有[“a”,1.2],因为它没有有效的类型。 – 2014-11-24 00:49:02
如果意图忽略无法读取的值,则定义'readMaybe x = {[(y,“”)] - >只是y; _ - > Nothing}'和'stringToDouble = catMaybes。地图readMaybe' – user2407038 2014-11-24 01:12:16