LINUX.ORG.RU

[F#] operators overloading


0

1

Как заставить этот ненавистный F# переопределить такие операторы как & для отдельных типов, но не глобально.

type t(m) = 
    member this.m : string = m 
    static member (&) (a : t, b : t) = a.m, b.m
> t("t1") & t("t2");;

  t("t1") & t("t2");;
  --------^

C:\Documents and Settings\Kovalev\Local Settings\Temp\stdin(3,9): warning FS1203: In F# code, use 'e1 && e2' instead of 'e1 & e2'

  t("t1") & t("t2");;
  ^^^^^^^

C:\Documents and Settings\Kovalev\Local Settings\Temp\stdin(3,1): error FS0001: This expression was expected to have type
    bool    
but here has type
    t   

MSDN утверждает, что должно работать. Может стоит попробовать так:

let a1 = t("t1")
let a2 = t("t2")
let a3 = a1 & a2

Так сработает?

delete83 ★★
()
Ответ на: комментарий от delete83

Я имею в виду, может в интерпретаторе ошибка и типы он выводит позже, чем вычисляет оператор?

delete83 ★★
()
Ответ на: комментарий от delete83

не работает и так

кстати, вот арифметические операторы работают

type t(m) = 
    member this.m : string = m 
    static member (+) (a : t, b : t) = a.m, b.m
    static member (-) (a : t, b : t) = a.m, b.m // work
    static member (&) (a : t, b : t) = a.m, b.m // work
    static member (=) (a : t, b : t) = a.m, b.m 

pseudo-cat ★★★
() автор топика
Ответ на: комментарий от pseudo-cat

ой, ошибочка

type t(m) = 
    member this.m : string = m 
    static member (+) (a : t, b : t) = a.m, b.m // work
    static member (-) (a : t, b : t) = a.m, b.m // work
    static member (&) (a : t, b : t) = a.m, b.m 
    static member (=) (a : t, b : t) = a.m, b.m 

pseudo-cat ★★★
() автор топика

Warning 1 The name '(&)' should not be used as a member name. If defining a static member for use from other CLI languages then use the name 'op_Amp' instead. C:\Users\norgat\documents\visual studio 2010\Projects\test\ConsoleApplication1\Program.fs 38 20 ConsoleApplication1

Norgat ★★★★★
()
Ответ на: комментарий от Norgat

Warning 1 The name '(^)' should not be used as a member name because it is given a standard definition in the F# library over fixed types C:\Users\norgat\documents\visual studio 2010\Projects\test\ConsoleApplication1\Program.fs 38 20 ConsoleApplication1

Видимо часть операторов прибили железно и переопределить их нельзя, либо через глобальное переопределение.

Norgat ★★★★★
()
Ответ на: комментарий от pseudo-cat

Это говорит о том, что язык еще не готов к массовому применению. Я был о нем чуть лучшего мнения.

delete83 ★★
()
Ответ на: комментарий от Norgat

глобально для одного типа тоже нельзя, значит, видимо, или использовать операторы, которые не часть монолита, или свои операторы, или глобально через obj переписывать для каждого(!) типа, используемого в модуле

pseudo-cat ★★★
() автор топика
Ответ на: комментарий от pseudo-cat

Допустимые операторные символы — !, %, &, *, +, -, ., /, <, =, >, ?, @, ^, |и ~.

Выбирай понравившеюся комбинацию, из допустимых, и юзай. <|> допустима, к примеру. В общем - фантазируй в пределах возможного :)

Norgat ★★★★★
()
Ответ на: комментарий от pseudo-cat

Кстати, единственный eDSL на F#, который я знаю - это WebSharper. http://www.websharper.com/samples - глянь их примеры, может какие идеи найдёшь для себя.

Norgat ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.