将isAlpha应用于递归函数

骆驼

我创建了一个函数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)
jpmarinier

恐怕我们需要为您的函数选择另一个名称,例如“ smallest”,因为我们需要使用filter的库版本filter :: (a -> Bool) -> [a] -> [a]

minimum将常规函数应用于字符串时,它按字典顺序返回最小值,这绝对不是我们在此处想要的值。

然而,许多库函数,如groupsortminimum,有兄弟姐妹的名字结束与“通过”。当较简单的功能无法完成预期的任务时,最终可以使用同级功能。兄弟姐妹接受一个额外的功能参数,该参数允许调用者以某种方式自定义手头的任务。

例如,您有一个minimumBy函数:

 λ> 
 λ> :type minimumBy
 minimumBy :: Foldable t => (a -> a -> Ordering) -> t a -> a
 λ> 

最初的想法是尝试minimumBy length,但是甚不会进行typecheck:函数length返回的Int不是Ordering值,可以是GTorLT或or EQ

因此,我们需要在minimumBy之间添加一些管道功能length管道函数的类型签名必须是这样的Ord c => (a -> c) -> (a -> a -> Ordering),有a作为字符串类型,cInt类型。

在从头开始编写此类功能之前,我们可以检查该功能是否已包含在库中。我们通过将所需的类型签名提交到Hoogle中来进行检查

Hoogle立即我们指出了功能comparing

该功能可以完成以下任务:

 λ>
 λ> 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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

递归地将函数应用于列表元素

来自分类Dev

Prolog将函数递归应用于列表

来自分类Dev

如何使用递归将函数应用于列表

来自分类Dev

函数,将函数应用于列表

来自分类Dev

如何将备忘录应用于此递归函数?

来自分类Dev

如何将收益率应用于递归函数

来自分类Dev

将函数应用于字典值

来自分类Dev

将函数应用于矩阵的多行

来自分类Dev

将函数应用于元素列表

来自分类Dev

Django的。将函数应用于queryset

来自分类Dev

将函数应用于元素列表

来自分类Dev

将函数应用于变量

来自分类Dev

将函数应用于元组数组

来自分类Dev

Matlab:将函数应用于向量

来自分类Dev

将函数应用于数据框

来自分类Dev

将函数应用于字典

来自分类Dev

将函数应用于整个表

来自分类Dev

将Angular Pipe应用于Angular递归列表模板

来自分类Dev

在haskell的递归函数定义中将函数应用于递归构建的列表

来自分类Dev

如何使用jq递归地将函数应用于记录结构中的所有字符串

来自分类Dev

如何递归/重复地将二进制函数(按位XOR)应用于R中的向量?

来自分类Dev

将模板参数应用于函数而不调用函数?

来自分类Dev

将函数应用于dplyr的group_by的输出

来自分类Dev

将函数应用于R中的列表矩阵

来自分类Dev

将函数应用于向量中元素的每个组合

来自分类Dev

将函数应用于动态生成的元素

来自分类Dev

将函数应用于数组的每对行

来自分类Dev

将修改顺序应用于字符串的函数

来自分类Dev

将累积均值函数应用于分组对象