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) 这是我的功能:
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; 我会解决这个问题,但我认为这个问题仍然有意义.
好吧,所以我有一个窗口,其中包含以下资源
<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)
我收到一条错误消息,说"会员"内容"无法识别或无法访问." 我究竟做错了什么?
此代码正确编译.它有一些未使用的代码警告,但现在没问题.
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_int和stack: Vec<Object<'a>>.
我正在尝试制作基于堆栈的VM.我想将状态传递给函数,函数可以从堆栈中取出东西,操作东西,然后将一些东西放回堆栈; 命名字段将保存命名对象.
我有一种预感,将堆栈表示为Vec<&'a Object<'a>>替代会更好.我现在拥有它的方式,我担心我会犯一些效率低下的错误.我的预感是正确的吗?
问题的第二部分是我不知道如何使引用版本的矢量工作.以适当的生命周期创建新值以推入堆栈对我来说不起作用.
我对这个问题有点模糊,所以如果我一直不清楚,请问我问题以清除问题.
我对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) 这是我的代码:
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提示符,但我也想给我的应用程序控件.
我该怎么做呢?
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#中实现什么?
所以我很好奇如果我将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属性不打印.这是为什么?