小编phi*_*hil的帖子

如何确定对象是否是F#中的某种类型

在C#中我可以使用关键字'is'

if (variable is string)
{
}
Run Code Online (Sandbox Code Playgroud)

怎么在f#中完成

f#

15
推荐指数
1
解决办法
7667
查看次数

Bitmap.SetPixel在f#中的行为比在c#中的行为慢

f#代码比c#代码慢了500倍.我究竟做错了什么?我尝试使两种语言的代码基本相同.在F#中,SetPixel的速度要慢得多.

F#:

module Imaging
open System.Drawing;
#light
type Image (width : int, height : int) = class
  member z.Pixels = Array2D.create width height Color.White

  member z.Width with get() = z.Pixels.GetLength 0

  member z.Height with get() = z.Pixels.GetLength 1

  member z.Save (filename:string) =     
    let bitmap = new Bitmap(z.Width, z.Height)
    let xmax = bitmap.Width-1
    let ymax = bitmap.Height-1
    let mutable bob = 0;
    for x in 0..xmax do
      for y in 0..ymax do
        bitmap.SetPixel(x,y,z.Pixels.[x,y])
    bitmap.Save(filename)

  new() = Image(1280, 720)
end
let bob …
Run Code Online (Sandbox Code Playgroud)

c# f#

11
推荐指数
1
解决办法
660
查看次数

F#是否使用|> Option.bind进行TCO(尾调用优化)

这是我的功能:

let rec applyAll rules expr =
  rules
  |> List.fold (fun state rule ->
    match state with
    | Some e ->
      match applyRule rule e with
      | Some newE -> Some newE
      | None -> Some e
    | None -> applyRule rule expr) None
  |> Option.bind (applyAll rules)
Run Code Online (Sandbox Code Playgroud)

它采用一组规则并应用它们,直到输入表达式尽可能减少.我可以重写它Option.bind是一个match表达式,它显然会利用尾部调用优化.但是,这对我来说更优雅,所以我希望保持原样,除非它不必要地消耗堆栈.F#是否使用此代码执行TCO?

编辑:此代码始终返回None; 我会解决这个问题,但我认为这个问题仍然有意义.

f# tail-recursion

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

WPF - TemplateBinding无法识别成员内容

好吧,所以我有一个窗口,其中包含以下资源

<Window.Resources>
    <Style TargetType="Button">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate>
                    <Grid>
                        <TextBlock Text="{TemplateBinding Content}"/>
                    </Grid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</Window.Resources>
Run Code Online (Sandbox Code Playgroud)

我收到一条错误消息,说"会员"内容"无法识别或无法访问." 我究竟做错了什么?

wpf controltemplate

6
推荐指数
1
解决办法
4887
查看次数

何时以及如何使用引用向量

此代码正确编译.它有一些未使用的代码警告,但现在没问题.

use std::collections::BTreeMap;

enum Object<'a> {
    Str(String),
    Int(i32),
    Float(f32),
    Vector(Vec<&'a Object<'a>>),
    Prim(fn(State) -> State)
}

struct State<'a> {
    named: BTreeMap<String, &'a Object<'a>>,
    stack: Vec<Object<'a>>

}

impl<'a> State<'a> {
    fn push_int(&mut self, x: i32) {
        self.stack.push(Object::Int(x));
    }
}


fn main() {
    println!("Hello, world!");
    let obj = Object::Str("this is a test".to_string());
}
Run Code Online (Sandbox Code Playgroud)

这段代码的重要部分是push_intstack: Vec<Object<'a>>.

我正在尝试制作基于堆栈的VM.我想将状态传递给函数,函数可以从堆栈中取出东西,操作东西,然后将一些东西放回堆栈; 命名字段将保存命名对象.

我有一种预感,将堆栈表示为Vec<&'a Object<'a>>替代会更好.我现在拥有它的方式,我担心我会犯一些效率低下的错误.我的预感是正确的吗?

问题的第二部分是我不知道如何使引用版本的矢量工作.以适当的生命周期创建新值以推入堆栈对我来说不起作用.

我对这个问题有点模糊,所以如果我一直不清楚,请问我问题以清除问题.

reference vector rust

6
推荐指数
1
解决办法
3421
查看次数

使用nix构建简单的haskell库

我对Nix感兴趣了一段时间,我想我最终会尝试用它来启动一个新的haskell项目.

我从目录结构开始

project.cabal
src/Lib.hs
Run Code Online (Sandbox Code Playgroud)

cabal文件具有以下内容:

name: project
version: 0.1.0.0
build-type: Simple
license: MIT
cabal-version: >= 1.18

library
  exposed-modules: Lib
  build-depends: base < 5
  hs-source-dirs: src
  default-language: Haskell2010
Run Code Online (Sandbox Code Playgroud)

和Lib.hs有

module Lib where

hello :: Int -> IO ()
hello x = putStrLn (show x)
Run Code Online (Sandbox Code Playgroud)

如您所见,它非常简单.当我执行时cabal build,它似乎很高兴.请注意,我无论如何都不是哈斯克尔专家,所以我可能会在这里犯一些初学者错误.

要使用Nix进行构建,我一直在阅读https://github.com/Gabriel439/haskell-nix来获取我的信息.我执行cabal2nix . > default.nix以获取我的cabal文件的Nix版本.然后我创建了一个release.nix文件来实际构建它.这两个文件的内容如下:

default.nix

{ mkDerivation, base, stdenv }:
mkDerivation {
  pname = "project";
  version = "0.1.0.0";
  src = ./.;
  libraryHaskellDepends = [ base ];
  license …
Run Code Online (Sandbox Code Playgroud)

haskell nix

6
推荐指数
1
解决办法
317
查看次数

写入已经运行的进程

这是我的代码:

static void Main(string[] args)
{
    if(args.Length > 1)
    {
        int id;
        if(int.TryParse(args[0], out id))
        {
            try
            {
                var p = Process.GetProcessById(id);
                p.StandardInput.WriteLine(args[1]);
            }
            catch (ArgumentException)
            {
                Console.WriteLine($"Couldn't find process with id {id}");
            }
        }
        else
        {
            Console.WriteLine($"Couldn't find process with id {args[0]}");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我的id有一个进程.工作正常然后我试图向它的标准输入发送一些东西.这引发了InvalidOperationException.注意:当我尝试获取StandardInput时发生异常,而不是在我尝试使用WriteLine时发生.

我相信我知道为什么我得到例外.我的应用程序没有启动该进程,因此我从未有机会将RedirectStandardInput设置为true.

我的目标是能够使用此应用程序将文本发送到python交互式控制台(或其他语言).我仍然希望能够自己输入文本到python提示符,但我也想给我的应用程序控件.

我该怎么做呢?

c#

5
推荐指数
1
解决办法
323
查看次数

约束泛型类型以继承f#中的泛型类型

let mapTuple f (a,b) = (f a, f b)
Run Code Online (Sandbox Code Playgroud)

我正在尝试创建一个函数,将函数应用于f元组中的两个项目,并将结果作为元组返回.F#类型推断表示mapTuple返回'b*'b元组.它还假设a并且b属于同一类型.

我希望能够传递两种不同的类型作为参数.您会认为这不起作用,因为它们都必须作为参数传递给f.所以我认为如果它们从相同的基类继承,它可能会起作用.

对于我想要实现的目标,这是一个不太通用的函数.

let mapTuple (f:Map<_,_> -> Map<'a,'b>) (a:Map<int,double>,b:Map<double, int>) = (f a, f b)
Run Code Online (Sandbox Code Playgroud)

但是,它会出现类型不匹配错误.

我该怎么做?我想在F#中实现什么?

f#

3
推荐指数
1
解决办法
548
查看次数

属性构造函数不能使用console.writeline

所以我很好奇如果我将CallerMemberName属性应用于Attribute的构造函数的参数会发生什么.这是我非常简单的代码.

class MyAttribute : Attribute
{
    public MyAttribute(string message, [CallerMemberName] string name = "none specified")
    {
        Console.WriteLine("\{message}: \{name}");
    }
}
[My("Program")]
class Program
{
    [My("Main")]
    static void Main(string[] args)
    {
        var MyAttribute = new MyAttribute("Inner");
        Console.ReadLine();
    }
}
Run Code Online (Sandbox Code Playgroud)

我运行代码,什么也没发生.所以我在构造函数中放置了一个断点,看它是否会被击中.确实如此.但是,即使Writeline调用似乎正在执行,也没有任何东西出现.为什么不?

此外,断点没有被[My("Program")]属性命中.为什么不?

编辑:根据SLaks的回答,有一个竞争条件对该计划可能是致命的.我将构造函数的内部更改为:

new Thread(() =>
{
    Thread.Sleep(1000);
    Console.WriteLine("\{message}: \{name}");
}).Start();
Run Code Online (Sandbox Code Playgroud)

Main和Inner属性以这种方式打印,但Program属性不打印.这是为什么?

c# custom-attributes

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