我有一个用F#编写的库,供C#和F#使用。此库在模块bar中的命名空间random中定义了一个类foo
#light
namespace random
module bar
type foo() = ...
现在,当我使用类型random.foo.bar时,C#智能感知将其视为类型bar,嵌套在类型random.foo中。
问题是:将外部可使用的代码定义到模块中,而不是名称空间中,C#有没有优势?我知道模块是对函数进行分组的好方法,但是类呢?
以以下示例为例:
我有一节课
public class SomeItem
{
public string Name;
public DateTime Published;
public uint16 Size;
}
我有一个List<SomeItem>,我想要计算所有项目的总大小。
在C#中,我可以简单地写下
var totalSize = items.Sum((i) => i.Size);
我看过F#中的List函数,但他们总是抱怨类型不好。
如何在F#中编写此代码?
(我试过搜索引擎,但搜索引擎对F#的支持很糟糕)
我有一个用C#编写的现有项目。我想将其业务逻辑的一部分转移到F#。MyObjectX是一个运行科学算法的C#类。要运行MyObjectX,它需要实现几个接口,以及通过方法(而不是构造函数)注入的一些依赖项。示例:
public class MyObjectX(): IMathSolver, IBusinessSolver
{
//private fields
private int operationMode;
private ISignalProvider signal;
//Inject dependcy via method
public voi
我在F#中完全是新手,我正在尝试创建一个包含来自其他类的其他实例的对象。对我来说,在C#中这很容易,但在F#中我有严重的问题要理解它。 以下是我的代码 module Owe
type Owe= class
val Name: string
val Amount: float
new (name, amount) as this =
{
Name = name
Amount = amount
}
end 这就是我想要使用Owe对象…实例的类。但是,我不能调用Owe属性。 module Roomate
type Roomate = class
val Name : st
F#中的一个受歧视的联合被编译成一个抽象类,它的选项成为嵌套的具体类。
type DU = A | B
DU是抽象的,DU A和DU B是具体的。
使用ServiceStack,可以使用函数定制类型到JSON字符串和back的序列化。关于DU类型,下面是我如何在C#中这样做的。
using ServiceStack.Text;
JsConfig<DU.A>.SerializeFn = v => "A"; // Func<DU.A, String>
JsConfig<DU.B>.SerializeFn = v => "B&
我正在整理一些类作为一些信息的模型(我目前正在从一个网站中提取这些信息)。
类是在C#中实现的,因为在当前版本的F#中没有自动实现的属性。从网站中填充这些类的逻辑将在F#中写入。(因为我喜欢F#,而且它很适合网络抓取。)
因此,由于我是在功能上工作(我似乎总是在功能上工作,即使在C#中也是如此)。我不想让这些东西变。在F#中设置可变字段是很难看的(而且出于很好的理由,可变对象是邪恶的)。
因此,所有的数据字段都只有私有的setter,但是这使得我的构造函数很长。无论如何,我计划在它们中使用命名参数,但仍然有5个参数是很多的。而且我不认为F#支持对象属性初始化符。
public class Po
我已经在一个名为SyncManage2的C#解决方案中创建了一个db4o数据库。这是程序集名称,也是命名空间。其中有一个名为DicEntry的类。
我想从另一个名为SyncText2的C#解决方案访问该数据库,该解决方案包含两个项目,其中一个是程序集名称为GlossWorks的F#项目,它负责数据库的工作。F#数据库代码位于一个名为Glossing的模块中。
那么,如何设置TypeAlias呢?我试过所有我能想到的组合,但没有一个是joy
let openDictionary():IEmbeddedObjectContainer =
let alyas = TypeAlias("
我正在使用.Net测试一些redis,我已经阅读了这篇教程,并且使用c#工作得很好,现在当我尝试将它翻译成f#时,我有一个奇怪的行为,首先我创建了一个简单的f#类(使用类型也不起作用,但这是预期的)...basicaly这个类是这样的:
//I ve used [<Class>] to
type Video (id : int, title : string , image : string , url : string) =
member this.Id = id
member this.Title = title
member this.Image = image
F#允许在类型的成员上约束泛型类型,类似于:
type ClassWithMemberConstraint<'T when 'T : (static member StaticProperty : unit)> =
class end
这可能非常方便,尤其是因为CLR不允许定义具有静态成员的接口。因为F#允许这样的约束,我猜这意味着CLR也允许泛型成员约束,但据我所知,这在C#中是不可能的。
有什么方法可以在C#中表达这种行为吗?
使用和F#如何使用.ForContext与函数?它似乎只接受类型类:
type A()=
log = Serilog.Log.ForContext<A>() // ✅
let f _ =
log = Serilog.Log.ForContext<f>() // compile error
log = Serilog.Log.ForContext(f.GetType()) // the information is not the same as A where it gives module + type path
添加F#函数或C#方法的上下文(我认为这应
在博客帖子 on F#上,为了好玩和利润,它说:
在功能设计中,将行为与数据分离是非常重要的。数据类型简单且“哑”。然后分别对这些数据类型进行操作的函数有很多。这与面向对象的设计完全相反,在这种设计中,行为和数据应该结合在一起。毕竟,这正是一个类。事实上,在一个真正面向对象的设计中,除了行为之外,什么也没有--数据是私有的,只能通过方法访问。事实上,在面向对象设计中,没有足够的数据类型行为被认为是一件坏事,甚至有一个名字:"贫血域模型“。
考虑到在C#中,我们似乎一直在借用F#,并试图编写更多功能风格的代码;为什么我们不借用分离数据/行为的思想,甚至认为它不好呢?是简单的定义不适用于O
我在公共库(LibRoot)中定义了一个记录类型,该记录类型由C# (LibC)和F# (LibF)代码使用。
然后,我在C#库(LibC)中编写了F#库(LibF)使用的公共API。但是,每当我试图将一个对象传递给这个API时,F#都会抱怨它必须有一个度量单位。
//LibRoot - F#
type Vec2<[Measure] 'u> = {
X : int
Y : int
}
//LibC - C#
public static class Funcs
{
public void DoWork(Vec2 vec) { //no measure