当前位置: 首页 > 知识库问答 >
问题:

在Raku中,如何编写Haskell的span函数的等价物?

萧凡
2023-03-14

在Raku中,如何编写Haskell的spa函数的等价物?

在Haskell中,给定一个谓词和一个列表,可以将列表分成两部分:

  • 满足谓词的元素的最长前缀

例如,Haskell表达式...

span (< 10) [2, 2, 2, 5, 5, 7, 13, 9, 6, 2, 20, 4]

…计算结果为…

([2,2,2,5,5,7],[13,9,6,2,20,4])

如何编写Haskell的spa函数的Raku等价物?

基于@chenyf的回答,我开发了以下子程序…

sub span( &predicate, @numberList )
  {
  my $idx = @numberList.first(&predicate):k ;
  my @lst is Array[List] = @numberList[0..$idx-1], @numberList[$idx..*] ;
  @lst ;
  } # end sub span

sub MAIN()
  {
  my &myPredicate = { $_ > 10 } ;
  my @myNumberList is Array[Int] = [2, 2, 2, 5, 5, 7, 13, 9, 6, 2, 20, 4] ;
  my @result is Array[List] = span( &myPredicate, @myNumberList ) ;
  say '@result is ...' ;
  say @result ;
  say '@result[0] is ...' ;
  say @result[0] ;
  say @result[0].WHAT ;
  say '@result[1] is ...' ;
  say @result[1] ;
  say @result[1].WHAT ;
  } # end sub MAIN

程序输出为…

@result is ...
[(2 2 2 5 5 7) (13 9 6 2 20 4)]
@result[0] is ...
(2 2 2 5 5 7)
(List)
@result[1] is ...
(13 9 6 2 20 4)
(List)

共有2个答案

仰雅昶
2023-03-14

这是一种完全天真的看法:

sub split_on(@arr, &pred) {
  my @arr1;
  my @arr2 = @arr;

  loop {
    if not &pred(@arr2.first) {
      last;
    } 

    push @arr1: @arr2.shift
  }

  (@arr1, @arr2);
}

创建一个新的@arr1并将数组复制到@arr2。循环,如果数组中的第一个元素没有满足谓词,则是最后一次通过。否则,将第一个元素从@arr2移开并将其推送到@arr1

测试时:

my @a = [2, 2, 2, 5, 5, 7, 13, 9, 6, 2, 20, 4];
my @b = split_on @a, -> $x { $x < 10 };

say @b;

输出为:

[[2 2 2 5 5 7] [13 9 6 2 20 4]]

这里唯一的问题是。。。如果谓词不满足怎么办?好吧,让我们检查一下列表是否为空,或者是否满足谓词来终止循环。

sub split_on(@arr, &pred) {
  my @arr1;
  my @arr2 = @arr;

  loop {
    if !@arr2 || not &pred(@arr2.first) {
      last;
    } 

    push @arr1: @arr2.shift;
  }

  (@arr1, @arr2);
}
祁远
2023-03-14

我使用first方法: k副词,如下所示:

my @num  = [2, 2, 2, 5, 5, 7, 13, 9, 6, 2, 20, 4];
my $idx = @num.first(* > 10):k;

@num[0..$idx-1], @num[$idx..*];
 类似资料:
  • 我如何只使用dplyr函数(想象一下有6M行的巨大的Data.Table(BIGiris))来实现与下面的代码相同的功能呢 输出是这个。请注意,我必须重新命名列1。另外,在dplyr mutate或其他调用中,我希望以某种方式为我的新count列指定名称。 想象一下连接到这样一个表(假设iris data.frame有6M行),species更像是“species_id” 最终联接和输出(对于联接

  • 我正在修改一个关于开发者推荐的插件(见最新帖子),该插件建议在Wordpress的中编写一些Javascript。 现在,当我这样做的时候,我的整个WordPress变成了空白。嗯,经过一点思考..."你不能在PHP中写纯Javascript"... 所以我把它们写在一个

  • 问题内容: 有什么办法可以使以下在Swift 3中正常工作? 该功能应该采取型的封闭,运行它传递到它,然后简单地返回。 另一个选择是为此使用运算符,例如“ ”(从Kotlin和Xtend语言中借用了这个想法)。 试图做这样的扩展: 但是它需要在闭包中显式声明参数类型: 这不方便,并且使整个想法不值得付出努力。类型已经在对象创建时指定,并且应该有可能不明确地重复它。 谢谢! 问题答案: HasApp

  • 问题内容: 什么是mySQL 中SQLServer函数SCOPE_IDENTITY()的等效项? 问题答案: 这是您要寻找的: 为了回应OP的评论,我创建了以下基准测试: 返回: 因此,它使用原始表的,而不使用触发器内部的表。 编辑: 经过所有这些时间,我意识到答案中显示的结果是错误的,尽管最后的结论是正确的。我已将结果更新为正确的值。

  • 问题内容: 我是Firebase的新手。我正在使用admin sdk(java code)将数据存储在firebase数据库中。我已经成功完成了这一部分。现在我想在创建数据库条目和通知时写火基础云函数 由于我在Internet上搜索了更多内容,因此仅找到了node.js代码。 https://firebase.google.com/docs/functions/开始 是否可以使用admin SDK

  • 本文向大家介绍如何在Python中编写递归函数?,包括了如何在Python中编写递归函数?的使用技巧和注意事项,需要的朋友参考一下 一个递归 函数是它的执行过程中调用自身的函数。这使函数可以重复多次,输出结果和每次迭代的结束。递归与无限有关。  下面是一个递归函数示例,用于查找整数的阶乘。 数字的阶乘 是从1到该数字的所有整数的乘积。  例如,阶乘9(表示为9!)为1 * 2 * 3 * 4 *