我正在尝试进行一个简单的测试,在其中我将两个通用对象传递给测试函数,看看它们是否可以强制转换List<S>,并进一步检查列表的计数是否相等.
以下代码有效:
private static void Test<T> (T obj1, T obj2) {
if (typeof(T).IsGenericType) {
var genericTypeParam1 = typeof(T).GetGenericArguments().First();
Console.WriteLine(genericTypeParam1);
// LINE MARKER 1
// var obj1AsList = (obj1 as IEnumerable<genericTypeParam1>);
}
}
static void Main(string[] args) {
Test(Enumerable.Range(0, 5).ToList(), Enumerable.Range(0, 5).ToList());
Console.ReadLine();
}
Run Code Online (Sandbox Code Playgroud)
但如果我取消注释标记的行LINE MARKER 1,我会收到以下错误:
The type or namespace name 'genericTypeParam1' could not be found (are you missing a using directive or an assembly reference?)
Run Code Online (Sandbox Code Playgroud)
我事先不知道Test会收到Lists.但我的意图是先检查是否obj1与obj2可作为列表,然后进行比较
var obj1AsList = …Run Code Online (Sandbox Code Playgroud) 这是我的第一个F#计划.我以为我会把Conway的生命游戏作为第一个练习.
请帮助我理解为什么下面的代码有如此可怕的性能.
let GetNeighbours (p : int, w : int, h : int) : seq<int> =
let (f1, f2, f3, f4) = (p > w, p % w <> 1, p % w <> 0, p < w * (h - 1))
[
(p - w - 1, f1 && f2);
(p - w, f1);
(p - w + 1, f1 && f3);
(p - 1, f2);
(p + 1, f3);
(p + w - 1, f4 && f2);
(p …Run Code Online (Sandbox Code Playgroud) 这真是一个简单的问题(但我似乎无法在MSDN文档中找到答案).
如果我在F#中将大型序列和对象作为函数参数传递,它们是否总是按值复制,除非我提供了byref关键字?问题是,我无意修改参数,但同时,我不想每次调用函数时都要复制大对象.
我的试探性答案是否定的,如以下测试代码所示:
#include <functional>
#include <iostream>
#include <string>
#include <vector>
using namespace std;
void TestFunc (void);
int TestFuncHelper (vector<int>&, int, int);
int main (int argc, char* argv[]) {
TestFunc ();
return 0;
} // End main ()
void TestFunc (void) {
// Recursive lambda
function<int (vector<int>&, int, int)> r = [&] (vector<int>& v_, int d_, int a_) {
if (d_ == v_.size ()) return a_;
else return r (v_, d_ + 1, a_ + v_.at (d_));
};
int UpperLimit = 100000; …Run Code Online (Sandbox Code Playgroud) 我想传递一个类型名称(例如int,或者string,甚至是用户定义类型的名称)作为函数参数.目前我正在做以下事情:
type IntegerOrIntegerList =
| Integer of int
| IntegerList of int list
let f (n : int) (d : 'T) : IntegerOrIntegerList =
match (box d) with
| :? int as i -> Integer(n)
| _ -> IntegerList([0 .. n])
Run Code Online (Sandbox Code Playgroud)
但上述存在d是偶然的.表达上述逻辑的惯用F#方式是什么?
在此先感谢您的帮助.
对不起,很长的帖子.我想TcpListener用来监听端口,处理不同(后台)线程中传入连接所请求的繁重工作,然后在准备就绪时将响应发送回客户端.我在MSDN上阅读了很多代码和示例,并为服务器提出了以下实现.
对于以下所有实现,请假设以下变量:
let sva = "127.0.0.1"
let dspt = 32000
let respondToQuery (ns_ : NetworkStream) (bta_ : byte array) : unit =
// DO HEAVY LIFTING
()
Run Code Online (Sandbox Code Playgroud)
IMPLEMENTATION 1(普通的同步服务器;我从这个MSDN页面翻译代码)
let runSync () : unit =
printfn "Entering runSync ()"
let (laddr : IPAddress) = IPAddress.Parse sva
let (svr : TcpListener) = new TcpListener (laddr, dspt)
try
svr.Start ()
let (bta : byte array) = Array.zeroCreate<byte> imbs
while true do
printfn "Listening on port …Run Code Online (Sandbox Code Playgroud) 以下计算序列无错误地运行:
type Monad_1 () =
member M.Bind (so : 'T option, bf : 'T -> 'T option) : 'T option =
match so with
| Some s -> bf s
| None -> None
member M.Delay (df : unit -> 'T) : 'T = // SEE CORRECTION 1
df ()
member M.Return (rv : 'T) : 'T option =
Some rv
let test_1 () : unit =
let m_1 = Monad_1 ()
let cero =
m_1 {
let x1 = …Run Code Online (Sandbox Code Playgroud) 我有以下简单类型:
module Structures
type Point2D<'T> (x : 'T, y : 'T) =
member this.X = x
member this.Y = y
member this.IsEqualTo (p : Point2D<'T>) =
(this.X = p.X) && (this.Y = p.Y)
Run Code Online (Sandbox Code Playgroud)
但Visual Studio(2012试用版)在名称"IsEqualTo"下放置一条红色波浪线,在"this.X"下放置一条蓝色波浪线.
红色波浪线的错误消息如下:
通用成员IsEqualTo已在此程序点之前的非均匀实例化中使用.考虑重新排序成员,以便首先发生此成员.或者,明确指定成员的完整类型,包括参数类型,返回类型和任何其他通用参数和约束.
蓝线的消息是:
类型参数缺少约束'when'T:equality'
我已经尝试在所有其他成员之前放置"IsEqualTo",但错误仍然存在.
我猜这个错误与=登录this.X = p.X工作在泛型类型上的事实有关,'T但我似乎无法纠正它.
预先感谢您的帮助.
我已将有问题的代码隔离到此函数(使用ASP.NET的Membership类):
let dbctx = DBSchema.GetDataContext()
let rec h1 (is2_ : int) (ie2_ : int) : unit =
match is2_ >= ie2_ with
| true ->
let st2 = query {
for row in dbctx.Tbl_Students do
where (row.Id = is2_)
head}
let l2 =
Membership.FindUsersByEmail (st2.Email_address)
|> Seq.cast<_>
|> Seq.length
match l2 >= 1 with
| true ->
()
| false ->
Membership.CreateUser (st2.Email_address, password, st2.Email_address)
|> ignore
h1 (is2_ - 1) ie2_
| false ->
()
Run Code Online (Sandbox Code Playgroud)
System.OutOfMemoryException经过几次5626迭代后我才得到了 …
let socket_CreateBindListen (sv_ : string) (pt_ : int) : Socket option =
let (he : IPHostEntry) = Dns.GetHostEntry(sv_)
let rsock, ipe =
he.AddressList
|> Seq.map (fun s ->
let (ipe2 : IPEndPoint) = new IPEndPoint (s, pt_)
let (rsock2 : Socket) = new Socket (ipe2.AddressFamily, SocketType.Stream, ProtocolType.Tcp)
rsock2.Connect ipe2 ///// <---- No connection could be made because the target machine actively refused it
rsock2, ipe2)
|> Seq.find (fun (s, t) -> s.Connected)
try
rsock.Bind ipe …Run Code Online (Sandbox Code Playgroud) f# ×8
generics ×2
async-await ×1
asynchronous ×1
c# ×1
c++ ×1
c++11 ×1
lambda ×1
monads ×1
parameters ×1
performance ×1
recursion ×1
sequences ×1
sockets ×1
tcplistener ×1
types ×1