Tôi đã chơi xung quanh với D, cố gắng bắt chước Scala style curryable functions bằng cách biểu diễn chuỗi lambda.Tạo hàm curryable với lambdas trong D không hoạt động như class struct memebers
tôi đến với điều này:
immutable foo=function(immutable int x)=>(immutable int y)=>(x+y);
struct S
{
static immutable foo=function(immutable int x)=>(immutable int y)=>(x+y);
}
class C static immutable foo=function(immutable int x)=>(immutable int y)=>(x+y);
}
void main()
{
writefln("global\t%s",foo(1)(2));
writefln("struct\t%s",S.foo(1)(2));
writefln("class\t%s",C.foo(1)(2));
}
Đây là những gì tôi nhận được khi tôi chạy nó:
global 3
struct 1528543170
Segmentation fault
Như bạn có thể thấy, phương pháp của tôi hoạt động tốt cho biến chức năng toàn cầu, nhưng biến chức năng tĩnh của cấu trúc cho kết quả rác, và biến chức năng tĩnh của lớp không hoàn toàn. Nếu tôi xóa x
khỏi biểu thức trả lại - function(immutable int x)=>(immutable int y)=>(y)
- phiên bản cấu trúc cung cấp kết quả chính xác (2
), nhưng phiên bản lớp vẫn không thành công.
Nếu tôi sử dụng một phương pháp thông thường, thay vì một biến chức năng:
immutable foo=function(immutable int x)=>(immutable int y)=>(x+y);
struct S
{
static auto foo(immutable int x)
{
return (immutable int y)=>(x+y);
}
}
class C
{
static auto foo(immutable int x)
{
return (immutable int y)=>(x+y);
}
}
void main()
{
writefln("global\t%s",foo(1)(2));
writefln("struct\t%s",S.foo(1)(2));
writefln("class\t%s",C.foo(1)(2));
}
nó hoạt động tốt:
global 3
struct 3
class 3
Và tôi cũng có được lợi thế của việc sử dụng các đại biểu (trình biên dịch giành' t cho phép các đại biểu trong phiên bản đầu tiên) - nhưng phong cách này ít thanh lịch hơn.
Tôi biết rõ rằng D có chức năng curry
trong thư viện std.functional
cho chức năng currying, nhưng đôi khi sẽ thoải mái hơn khi thực hiện chức năng theo mặc định và bên cạnh - Tôi tò mò muốn biết tại sao phiên bản đầu tiên của tôi không ' t làm việc.
Bất kỳ ý tưởng nào?
CẬP NHẬT
OK, I've filed a bug. Tôi đã thực hiện một số chi tiết đào, và nó quay ra danh sách đối số của foo
được chuyển, và đó là lý do tại sao x
nhận được dữ liệu rác.
WHOA bạn có thể nói 'function' * và * nói' => 'cùng một lúc ?! Không biết điều đó! :) – Mehrdad
Nhân tiện, bạn có thử nói 'static __gshared' thay vì' static' bằng bất kỳ cơ hội nào không? * Có lẽ * nó sẽ hoạt động (ngón tay vượt qua ... Tôi không có một trình biên dịch tiện dụng) – Mehrdad