我创建了一个函数filter
,该函数在列表中找到最小的项,并过滤掉包含非字母字符的任何字符串。例如
filter ["a","bb","ccc","dddd","e","f"] = "a"
但是如果我使用这个例子filter ["**", "a", "?"] = "**"
而不是isAlpha似乎不起作用= "a"
filter :: [String] -> String
filter [] = error "String is Empty"
filter [x] = x
filter (x:y:xs) = if x < y && all isAlpha x then g(x:xs) else g(y:xs)
恐怕我们需要为您的函数选择另一个名称,例如“ smallest”,因为我们需要使用filter
:的库版本filter :: (a -> Bool) -> [a] -> [a]
。
minimum
当将常规函数应用于字符串时,它按字典顺序返回最小值,这绝对不是我们在此处想要的值。
然而,许多库函数,如group
,sort
,minimum
,有兄弟姐妹的名字结束与“通过”。当较简单的功能无法完成预期的任务时,最终可以使用同级功能。兄弟姐妹接受一个额外的功能参数,该参数允许调用者以某种方式自定义手头的任务。
例如,您有一个minimumBy
函数:
λ>
λ> :type minimumBy
minimumBy :: Foldable t => (a -> a -> Ordering) -> t a -> a
λ>
最初的想法是尝试minimumBy length
,但是甚至不会进行typecheck:函数length
返回的Int
不是Ordering
值,可以是GT
orLT
或or EQ
。
因此,我们需要在minimumBy
和之间添加一些管道功能length
。管道函数的类型签名必须是这样的Ord c => (a -> c) -> (a -> a -> Ordering)
,有a
作为字符串类型,c
该Int
类型。
在从头开始编写此类功能之前,我们可以检查该功能是否已包含在库中。我们通过将所需的类型签名提交到Hoogle中来进行检查。
该功能可以完成以下任务:
λ>
λ> import Data.Ord
λ>
λ> :type comparing
comparing :: Ord a => (b -> a) -> b -> b -> Ordering
λ>
λ> :type minimumBy (comparing length)
minimumBy (comparing length)
:: (Foldable t1, Foldable t2) => t1 (t2 a) -> t2 a
λ>
λ>
λ> minimum ["aaa","bb","cccx","eer"]
"aaa"
λ>
λ> minimumBy (comparing length) ["aaa","bb","cccx","eer"]
"bb"
λ>
首要任务是消除那些包含非字母字符的字符串。可以按照Kevin P. Barry的出色回答中的描述进行操作,并且涉及filter
库函数。
综上所述:
import Data.List (minimumBy)
import Data.Ord (comparing)
import Data.Char (isAlpha)
smallest :: [String] -> String
smallest sts = let alphas = filter (all isAlpha) sts
in if (null alphas)
then error "No alphabetic strings in list"
else minimumBy (comparing length) alphas
测试根据ghci
:
λ>
λ> smallest ["aaa","bb","cccx","dddd-","eer","+"]
"bb"
λ>
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句