Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 从字符串中检索十进制数,并将它们递归地放入[Int]列表中_String_List_Haskell_Recursion_Type Conversion - Fatal编程技术网

String 从字符串中检索十进制数,并将它们递归地放入[Int]列表中

String 从字符串中检索十进制数,并将它们递归地放入[Int]列表中,string,list,haskell,recursion,type-conversion,String,List,Haskell,Recursion,Type Conversion,我正在学习learnyouahaskell章节,并一直在尝试递归函数和保护。我找到了一些练习,其中一个是从[Int]形式的字符串中检索十进制数。这就是我到目前为止所做的: retrieveDecimalsFromString :: String -> [Int] retrieveDecimalsFromString (x:xs) | x `elem` ['0'..'9'] = x:retrieveDecimalsFromString xs | otherwise = ret

我正在学习learnyouahaskell章节,并一直在尝试递归函数和保护。我找到了一些练习,其中一个是从[Int]形式的字符串中检索十进制数。这就是我到目前为止所做的:

retrieveDecimalsFromString :: String -> [Int]
retrieveDecimalsFromString (x:xs)
    | x `elem` ['0'..'9'] = x:retrieveDecimalsFromString xs
    | otherwise = retrieveDecimalsFromString xs
这会崩溃,我理解,因为我返回的是字符串而不是[Int]。不过,我似乎找不到解决这个问题的办法。也许我的方法是错误的。或者,在没有递归的情况下,我尝试:

retrieveDecimalsFromString :: String -> [Int]
retrieveDecimalsFromString xs = filter (`elem` ['0'..'9']) xs
这导致了同样的问题。可以做到以上几点吗

使用递归时,应该有一个基本条件。在代码中,当字符串为空时,它将执行什么操作?这是你的基本条件。所以,像这样更改函数定义

retrieveDecimalsFromString :: String -> [Int]
retrieveDecimalsFromString "" = []
retrieveDecimalsFromString (x:xs)
    | x `elem` ['0'..'9'] = (digitToInt x):retrieveDecimalsFromString xs
    | otherwise = retrieveDecimalsFromString xs
retrieveDecimalsFromString :: String -> [Char]
retrieveDecimalsFromString xs = filter (`elem` ['0'..'9']) xs
基本条件是,如果输入是空字符串,我将返回一个空列表

现在,当x是其中一个数字时,x:retrieveDecimalsFromString xs将做什么?它将尝试创建一个列表。但是第一个元素x是Char,根据retrieveDecimalsFromString的定义,返回值是[Int]。所以,您需要将Char转换为Int,如下所示

retrieveDecimalsFromString :: String -> [Int]
retrieveDecimalsFromString "" = []
retrieveDecimalsFromString (x:xs)
    | x `elem` ['0'..'9'] = (digitToInt x):retrieveDecimalsFromString xs
    | otherwise = retrieveDecimalsFromString xs
retrieveDecimalsFromString :: String -> [Char]
retrieveDecimalsFromString xs = filter (`elem` ['0'..'9']) xs
在筛选器版本中,您说retrieveDecimalsFromString将根据签名返回[Int],但筛选的结果将是[Char]。这就是它不起作用的原因。您可以通过在以下任一位置更改类型来修复此问题

retrieveDecimalsFromString :: String -> [Int]
retrieveDecimalsFromString "" = []
retrieveDecimalsFromString (x:xs)
    | x `elem` ['0'..'9'] = (digitToInt x):retrieveDecimalsFromString xs
    | otherwise = retrieveDecimalsFromString xs
retrieveDecimalsFromString :: String -> [Char]
retrieveDecimalsFromString xs = filter (`elem` ['0'..'9']) xs

注意:函数位于Data.Char中。因此,您需要在使用它之前导入它

使用递归时,应该有一个基本条件。在代码中,当字符串为空时,它将执行什么操作?这是你的基本条件。所以,像这样更改函数定义

retrieveDecimalsFromString :: String -> [Int]
retrieveDecimalsFromString "" = []
retrieveDecimalsFromString (x:xs)
    | x `elem` ['0'..'9'] = (digitToInt x):retrieveDecimalsFromString xs
    | otherwise = retrieveDecimalsFromString xs
retrieveDecimalsFromString :: String -> [Char]
retrieveDecimalsFromString xs = filter (`elem` ['0'..'9']) xs
基本条件是,如果输入是空字符串,我将返回一个空列表

现在,当x是其中一个数字时,x:retrieveDecimalsFromString xs将做什么?它将尝试创建一个列表。但是第一个元素x是Char,根据retrieveDecimalsFromString的定义,返回值是[Int]。所以,您需要将Char转换为Int,如下所示

retrieveDecimalsFromString :: String -> [Int]
retrieveDecimalsFromString "" = []
retrieveDecimalsFromString (x:xs)
    | x `elem` ['0'..'9'] = (digitToInt x):retrieveDecimalsFromString xs
    | otherwise = retrieveDecimalsFromString xs
retrieveDecimalsFromString :: String -> [Char]
retrieveDecimalsFromString xs = filter (`elem` ['0'..'9']) xs
在筛选器版本中,您说retrieveDecimalsFromString将根据签名返回[Int],但筛选的结果将是[Char]。这就是它不起作用的原因。您可以通过在以下任一位置更改类型来修复此问题

retrieveDecimalsFromString :: String -> [Int]
retrieveDecimalsFromString "" = []
retrieveDecimalsFromString (x:xs)
    | x `elem` ['0'..'9'] = (digitToInt x):retrieveDecimalsFromString xs
    | otherwise = retrieveDecimalsFromString xs
retrieveDecimalsFromString :: String -> [Char]
retrieveDecimalsFromString xs = filter (`elem` ['0'..'9']) xs


注意:函数位于Data.Char中。因此,您需要在使用它之前导入它。

最初我正在与基本条件作斗争,为了我的问题,我删除了不正确的行。也谢谢你把这件事弄清楚。你的深入解释证实了我自己的思考过程。我确实遇到过DigitPoint,但我不知道在Haskell中使用了导入。非常感谢你,它的工作就像一个魅力!retrieveDecimalsFromString=映射数字点。过滤器isDigit看起来更漂亮一点。最初我正在与基本条件作斗争,为了我的问题,我删除了我不正确的行。也谢谢你把这件事弄清楚。你的深入解释证实了我自己的思考过程。我确实遇到过DigitPoint,但我不知道在Haskell中使用了导入。非常感谢你,它的工作就像一个魅力!retrieveDecimalsFromString=映射数字点。过滤器是数字的,看起来更漂亮一点。