无法在F#扩展运营商?

module FSharp= let Point2d (x,y)= Point2d(x,y) let Point3d (x,y,z)= Point3d(x,y,z) type NXOpen.Point3d with static member ( * ) (p:Point3d,t:float)= Point3d(pX*t,pY*t,pZ*t) static member ( * ) (t:float,p:Point3d)= Point3d(pX*t,pY*t,pZ*t) static member (+) (p:Point3d,t:float)= Point3d(p.X+t,p.Y+t,p.Z+t) static member (+) (t:float,p:Point3d)= Point3d(p.X+t,p.Y+t,p.Z+t) static member (+) (p:Point3d,t:Point3d)= Point3d(p.X+tX,p.Y+tY,p.Z+tZ) let a=Point3d (1.,2.,3.) let b=1.0 let c=a * b//error

错误15:类型“浮动”不匹配的类型
“三维点”E:\工作\扩展-RW \ VS \推广\ NXOpen.Extension.FSharp \ Module1.fs 18 13 NXOpen.Extension.FSharp

我想延长三维点方法,一些新的运营商。 但它不会传了过来。

--------------解决方案-------------

事实上,这是可能的。 有一种方法来扩展使用独一无二的和鲜为人知的三元运算符二元运算符?<- 所以你的情况,你可以试试这个:

type SumPoint3d = SumPoint3d with
static member (?<-) (p:Point3d, SumPoint3d, t ) = Point3d(pX + t , pY + t , pZ + t )
static member (?<-) (t , SumPoint3d, p:Point3d) = Point3d(pX + t , pY + t , pZ + t )
static member (?<-) (p:Point3d, SumPoint3d, t:Point3d) = Point3d(pX + tX, pY + tY, pZ + tZ)
static member inline (?<-) (a , SumPoint3d, b ) = a + b

type ProdPoint3d = ProdPoint3d with
static member (?<-) (p:Point3d, ProdPoint3d, t ) = Point3d(pX * t, pY * t, pZ * t)
static member (?<-) (t , ProdPoint3d, p:Point3d) = Point3d(pX * t, pY * t, pZ * t)
static member inline (?<-) (a , ProdPoint3d, b ) = a * b

let inline ( + ) ab = a ? (SumPoint3d ) <- b
let inline ( * ) ab = a ? (ProdPoint3d) <- b

let a=Point3d (1.,2.,3.)
let b=1.0

现在,你可以试试:

> let c=a * b ;;
val c : Point3d = Point3d (1.0,2.0,3.0)

> 2 * 3 ;;
val it : int = 6

如果Point3d类型在一个单独的程序,你不能修改声明,则有(不幸)没有办法实施标准的运营商如新的过载+* 。 在你的问题中的代码添加了运营商为扩展方法,但在寻找重载运算符时,F#编译器不会搜索扩展方法。

如果你不能修改库,再有三件事情可以做:

  • 创建一个包装Point3d存储的值Point3d ,并实现所有操作
    (但是这很可能将是相当低效)
  • 定义新的运营商不与内置的那些冲突。 例如,你可以使用+$$+标量从左边和右边乘法。 要声明这样的运营商,你可以这样写:

    let (+$) (f:float) (a:Point3d) = (...)

  • 实现自己Point3d类型做所有的工作,可能与它变成一个转换功能的Point3d ,当你需要调用的库。

这是很难说哪个选项是最好的 - 第二种方法可能是最有效的,但它将使代码看起来有点丑陋。 根据您的情况,选择1或3可以工作了。

分类:F# 时间:2012-01-01 人气:0
本文关键词: 扩展方法,运营商
分享到:

相关文章

  • 重载方法/运营商,产业就无法正常工作 2012-05-31

    我写的代码,当一个类只有不断访问其内容,这是由它提供了相同的方法,其他类继承,但与正常访问其成员. 当我尝试用gcc的我得到下面的错误代码进行编译: error: passing ‘const A’ as ‘this’ argument of ‘void A::operator()()’ discards qualifiers 这里是示例编译代码: #include<stdio.h> class ConstA { public: void operator()() co

  • C#中:隐运算符和扩展方法 2013-02-25

    我想创建一个PredicateBuilder<T>类,它包装一个Expression<Func<T, bool>>并提供了一些方法来轻松地建立了各种的表达And和Or方法. 我认为这将是冷静,如果我可以用这个PredicateBuilder<T>作为Expression<Func<T, bool>>直接,认为这可以由具有完成implicit operator方法的事情. 之类的精简版看起来是这样的: class PredicateBu

  • 我怎样才能使矩阵+运营商Scala呢? 2014-02-02

    我做了矩阵类和拖把方法(它需要的二元运算符作为参数,使得每个单元的操作),但Ican't使拖把方法+运营商. val matA = new Matrix[Int](List(1 :: 2 :: 3 :: Nil, 4 :: 5 :: 6 :: Nil)) val matB = new Matrix[Int](List(7 :: 8 :: 9 :: Nil, 10 :: 11 :: 12 :: Nil)) val matC =matA. mop( matB) (_ + _) //can work

  • 是线程安全的使用'收益'运营商的扩展方法“里? 2012-02-21

    将是线程安全的使用收益运营商的扩展方法里面? 例如: public static IEnumerable<CartItem> GetItems( this Cart cart ) { { while( cart.hasNext() ) yield return cart.GetNextItem( ); } } --------------解决方案------------- 我不完全知道你的意思,但收益率的回报基本上是导致该函数产生一个状态机的包装类,并返回类的一个实例. 每个收益回报是由状态机

  • 是否有可能定义一个扩展运营商的方法? 2013-11-17

    是有可能定义一个扩展方法,该方法在同一时间是操作者? 我想对于固定类添加到使用,实际上无法应用公知的操作者的可能性. 对于这种特殊的情况下,我想这样做: somestring++; //i really know that this string contains a numeric value 而且我不希望传播转换类型的所有代码. 我知道我可以在一个字符串创建包装类,并定义了运营商,但我想知道,如果这种事情是可能避免搜索和替换MySpecialString每个字符串声明. 编辑:作为最有说字符

  • LINQ运营商与LINQ方法:一个比其他的限制,优点/缺点? 2013-01-09

    什么是LINQ运营商和LINQ方法的利弊? 做一件有限制或​​附加功能,其他没有? --------------解决方案------------- 在LINQ术语"经营者"是不一样的在C#语言运营商的正常意义上的"操作员",(+,&&等). LINQ的标准查询运算符只是它们预计将在可能情况下通过大多数提供商(通过LINQ提供给对象,特别是那些)的LINQ的方法. 是你, 其实是问关于使用像这样的查询表达式的利弊: var query = from i

  • C#扩展方法和F#管道进运营商之间的关系是什么? 2015-01-21

    使用F#的几个小问题之后,我发现它有助于我想C#扩展方法为"转动的方式. 入配管向前操作者. 例如,给定的Int32s命名整数,C#代码的序列: ints.Where(i => i > 0) .Select(i => i * i) 类似于F#代码 let where = Seq.filter let select = Seq.map ints |> where (fun i -> i > 0) |> select (fun i -> i * i)

  • 为什么运营商比方法调用这么多慢? (结构是慢了在旧即时编译) 2012-02-24

    简介:我写在C#中高性能的代码. 是的,我知道C ++会给我更好的优化,但我还是选择使用C#. 我不想讨论这样的选择. 相反,我想从那些谁像我一样,正试图在.NET Framework编写高性能的代码听到. 问题: 为什么在下面比等效方法调用速度较慢的代码操作? 为什么方法传递了两个双打在下面的代码的速度比通过这里面有两个双打结构中的等效方法? (答:旧的即时编译器优化结构很差) 有没有办法让.NET JIT编译器为有效地处理简单的结构作为结构的成员? (A:获得新的JIT) 我想我知道:原来的

  • 运营商在C#中的方法参数 2012-09-12

    我不认为这是可以使用运营商作为一个方法的参数在C#3.0,但有没有办法模拟的或一些语法糖,使得它看起来这是怎么回事? 我问,因为我最近实施了C#中的画眉组合子,但在翻译Raganwald的红宝石例子 (1..100).select(&:odd?).inject(&:+).into { |x| x * x } 其内容为"把数字从1到100,让奇的人,把这些的总和,然后回答数的平方." 我达不到的符号#to_proc的东西. 这是在与:在select(&:odd?)

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 0.660 (s). 10 q(s)