您处于正确的轨道,因为@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,那么您的解决方案将是惯用的。
或者,使用(.) = fmap
和fmap f xs = [f x | x <- xs]
这样的事实,您甚至可以变得更加愚蠢,并最终得出以下结论:
counta :: [Char] -> Int
counta = [length x | x <- filter isDigit]
本文链接:https://www.f2er.com/3142094.html