使用列表理解如何计算字符列表中的位数

我需要使用Haskell中的列表理解来计算出现在字符列表中的位数。

到目前为止,我已经找到了使用递归的方法,但是我在使用列表推导方面很费力:

例如在以下列表中['1','2','3','4','a','s','d','f'] 答案将是5

我尝试使用递归以及高阶函数

列表理解:

counta :: [Char] -> Int
counta = [ x | x <- length . filter isDigit]

递归:

countb :: [Char] -> Int
countb [] = 0
countb (x:xs)  
    | isDigit x = 1 + countb xs 
    | otherwise = countb xs

我打电话给countb ['1','f'],答案是5

w52kdm 回答:使用列表理解如何计算字符列表中的位数

您处于正确的轨道,因为@AJFarmar指出了正确的答案。 让类型指导您的答案。

您需要一个具有列表并返回存在的数字位数的函数(Int) 因此该函数应具有您提到的类型:

counta :: [char] -> Int

但是您对counta的函数定义说这是一个列表。类型检查器可能抱怨的是列表不是Int。要使用列表理解习语,您需要获取列表的名称,让我们说xs,以便您可以遍历列表的每个元素。对于xs中的每个元素,它也必须是一个数字。您已经有一个函数isDigit,该函数可以告诉您char是否为数字。

现在您可以进行列表理解,告诉您所有这些元素到底是什么:

[x | x<-xs,isDigit x]

您需要对所有这些元素进行计数,因此将其传递给标准length函数。

counta = length [x | x<-xs,isDigit x]

,

如果您仅将{-# LANGUAGE MonadComprehensions #-}放在程序的开头,则您的第一次尝试实际上是按原样进行的。但是,这是非常独特的。

您的“列表理解”实际上是monad的理解,因为length . filter isDigit不是列表,而是函数,而函数是monad。同样,任何形式为[x | x <- stuff]的列表或monad理解都只相当于stuff。完成该转换后,您将不再需要启用MonadComprehensions,那么您的解决方案将是惯用的。

或者,使用(.) = fmapfmap f xs = [f x | x <- xs]这样的事实,您甚至可以变得更加愚蠢,并最终得出以下结论:

counta :: [Char] -> Int
counta = [length x | x <- filter isDigit]
本文链接:https://www.f2er.com/3142094.html

大家都在问