小编dha*_*ech的帖子

Perl 6类型推断

鉴于:

sub abc(Int $n) { say $n }
Run Code Online (Sandbox Code Playgroud)

如果我们传递一个类型的变量Str,abc我们会得到一个编译时错误:

my Str $s = "123";   abc $s;
Run Code Online (Sandbox Code Playgroud)

如果我们传递一个包含字符串的无类型变量,我们会收到运行时错误:

my $s = "123";   abc $s;
Run Code Online (Sandbox Code Playgroud)

C++支持auto允许类型推断的关键字.

是否可以auto在Perl 6中定义类似于:

auto $s = "123";
Run Code Online (Sandbox Code Playgroud)

会导致$s输入Str?

即,我们可以做到以下几点:

auto $s = "123";   abc $s;
Run Code Online (Sandbox Code Playgroud)

并得到一个编译时错误.

type-inference perl6 raku

10
推荐指数
3
解决办法
286
查看次数

功能构成

Compose功能下面.如果是f并且g是返回值的一元函数,则Compose(f,g)返回一个函数,该函数在被调用时x执行等价于f(g(x)).

static Func<X, Z> Compose<Z, Y, X>(Func<Y, Z> f,Func<X, Y> g) 
{ return x => f(g(x)); }
Run Code Online (Sandbox Code Playgroud)

这里有几个简单的Func值可以组成:

Func<int, bool> is_zero = x => { return x == 0; };

Func<int, int> mod_by_2 = x => { return x % 2; };
Run Code Online (Sandbox Code Playgroud)

这有效:

Console.WriteLine(Compose(is_zero, mod_by_2)(4));
Run Code Online (Sandbox Code Playgroud)

但是,如果我改为使用这些等效的静态方法:

static bool IsZero(int n) { return n == 0; }

static int ModBy2(int n) { return n % 2; }
Run Code Online (Sandbox Code Playgroud)

同样的例子不适用于那些.即这会产生编译时错误: …

c# functional-programming

9
推荐指数
1
解决办法
1984
查看次数

将F#函数传递给IEnumerable.Where vs IEnumerable.All

鉴于以下内容:

open System.Linq

let even n = n % 2 = 0

let seqA = seq { 0..2..10 }
Run Code Online (Sandbox Code Playgroud)

这是一个有效的表达式:

seqA.Where(even)
Run Code Online (Sandbox Code Playgroud)

但这不是:

seqA.All(even)
Run Code Online (Sandbox Code Playgroud)

为什么传递even到Where允许而不是All?

.net linq f#

9
推荐指数
1
解决办法
474
查看次数

适用于多个阵列

在Scheme中,您可以使用以下内容迭代多个列表for-each:

> (for-each (lambda (a b) (display (+ a b)) (newline)) '(10 20 30) '(1 2 3))
11
22
33
> 
Run Code Online (Sandbox Code Playgroud)

我知道在Perl中你可以使用for迭代单个列表.如Scheme示例中那样迭代多个列表的好方法是什么?

我对Perl 5或6的答案很感兴趣.

perl perl6 raku

8
推荐指数
3
解决办法
2029
查看次数

Brushes.White减慢了图形演示速度

下面是Conway在WPF中的生命游戏的一个(非常天真)实现.这只是一个演示......

XAML:

<Window x:Class="wpf_conway_life_2013_05_19.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="500" Width="500">
    <Grid>
        <Canvas Name="canvas"
            Width="auto"
            Height="auto" 
            HorizontalAlignment="Stretch"  
            VerticalAlignment="Stretch">
        </Canvas>
    </Grid>
</Window>
Run Code Online (Sandbox Code Playgroud)

代码背后:

using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using System.Windows.Shapes;
using System.Windows.Threading;

namespace wpf_conway_life_2013_05_19
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            var random = new Random();

            var data = new int[100, 100];

            var dataB = new int[100, 100];

            Func<int, int, int> at = (x, y) =>
                {
                    if (x < 0) x = 100 + …
Run Code Online (Sandbox Code Playgroud)

c# wpf brushes conways-game-of-life

8
推荐指数
1
解决办法
405
查看次数

定义可以通过方法语法调用的子例程

sqrt 可以通过函数语法调用:

> sqrt 16
4
Run Code Online (Sandbox Code Playgroud)

它也可以通过方法语法调用:

> 16.sqrt
4
Run Code Online (Sandbox Code Playgroud)

有没有办法通过方法语法使用户定义的子程序可以调用?

例如,让我们定义sq:

> sub sq(Int $n) { $n*$n }
sub sq (Int $n) { #`(Sub|64042864) ... }
> sq 4
16
Run Code Online (Sandbox Code Playgroud)

有没有办法让它可以作为方法调用?即

> 4.sq
Run Code Online (Sandbox Code Playgroud)

perl6

8
推荐指数
2
解决办法
127
查看次数

递归生成器 - 手动zip与运算符

这是来自Charles C Pinter的"摘要代数之书"的练习5.F.2:

我们G是该组{e, a, b, b^2, b^3, ab, ab^2, ab^3},其发电机满足a^2 = e,b^4 = e,ba = ab^3.写下表G.(G称为二面体组D4.)

这是一个小的Perl 6程序,它提供了一个解决方案:

sub generate(%eqs, $s)
{
    my @results = ();

    for %eqs.kv -> $key, $val {
        if $s ~~ /$key/ { @results.push($s.subst(/$key/, $val)); }
        if $s ~~ /$val/ { @results.push($s.subst(/$val/, $key)); }
    }

    for @results -> $result { take $result; }

    my @arrs = @results.map({ gather generate(%eqs, $_) }); …
Run Code Online (Sandbox Code Playgroud)

perl6

8
推荐指数
3
解决办法
450
查看次数

在github上托管VisualStudio项目的指南

我想在github上托管我的一些C#VisualStudio 2010项目.我猜想至少添加一个最小的.git/info/exclude文件是一个好习惯.对于我的FluentWpf项目,我在我的exclude文件中有这个:

FluentWpf/bin/*
FluentWpf/obj/*
Run Code Online (Sandbox Code Playgroud)

在将项目检入git之前是否还有其他最佳实践要遵循?

c# git github visual-studio

7
推荐指数
2
解决办法
3036
查看次数

定义元组方法

这是swap两元素元组的函数:

fn swap<A, B>(obj: (A, B)) -> (B, A)
{
    let (a, b) = obj;

    (b, a)
}
Run Code Online (Sandbox Code Playgroud)

使用示例:

fn main() {
    let obj = (10i, 20i);

    println!("{}", swap(obj));
}
Run Code Online (Sandbox Code Playgroud)

有没有办法swap在两元素元组上定义方法?即它可以被称为:

(10i, 20i).swap()
Run Code Online (Sandbox Code Playgroud)

methods tuples rust

7
推荐指数
1
解决办法
109
查看次数

单步执行Roslyn C#编译器

我已经构建了如此处所述的Roslyn源代码.

我想在C#编译器中添加一个断点,并逐步完成这个简单程序的补充:

using System;

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            var result = 1 + 2;

            Console.WriteLine(result);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我应该在哪里设置断点?它应该在编译过程的早期,因为我想逐步解析甚至是lexing.

如果我将CompilerExtension设置为启动项目并按F5(开始调试),则会启动运行新构建的编译器的Visual Studio副本.我想避免每次我想要逐步完成编译器时都启动一个新的Visual Studio实例.设置一个直接在上面的源上调用编译器代码的小程序有什么好方法?

c# roslyn

7
推荐指数
1
解决办法
628
查看次数