具有以下功能: let Calc =
// do something
if something
(false, 0)
else
(true, some value) 如何定义输出字段的名称? 在C#中我可以这样做: (bool Success, int Value) Calc().... 因此,当我得到结果时,我可以按名称访问Success和Value字段;如何在F#中执行相同的操作?
我想在f# visual studio代码或f# visual studio中创建一个gui窗体。 来自How can I enable a WinForms or WPF project in F#?!但是我没有看到"...This将是一个控制台应用程序,所以接下来选择项目属性并将应用程序|输出类型从控制台应用程序更改为Windows应用程序...“This image 同样的,Creating an F# WinForms application,但它不能工作。它在visual studio (而不是code)中打开。我只看到了这一点,但不想出去enter image descr
我正在尝试使用来自FSharp.Data的FSharp.Data,下面的示例是:
在这个示例中,他们定义了一个类型,然后使用该类型,但是看起来它们是在交互模式下进行的。我正试图在我的主要做同样的事情,但我不明白为什么它不工作。
在这方面,他们做了以下工作:
type Stocks = CsvProvider<"../data/MSFT.csv">
这是我的尝试:
open System
open System.IO
open FSharp.Data
// Process execution params
// args(0) = nesting
假设我有这些类型(请原谅C#语法,我是F#新手):
interface I { }
class A { }
class B : A, I { }
在C#中,我可以这样做:
A a = …
bool isI = a is I;
但是,在F#中,具有这样的功能:
let a : A = ...
我知道a可能包含B的一个实例并实现I。但是,这会导致编译错误,说明A与I不兼容。
let isI = a :? I
然而,这样做是可行的:
let isI = a :> obj :? I
为什么呢?当然,a :? I既不是上流社会,也不是沮丧的人。但是它是如何与obj一起工作的呢?接口是否算为对象子类
不久前,我决定学习Haskell,以帮助学习更“纯功能”的思想,我可以应用到F#中。从一开始,Haskell中似乎没有像F#那样的真正类型。我对此很满意,所以我想找到一种方法,让我从我在F#中使用的混合OO/Functional中解脱出来,真正尝试无类化,真正地开发一个以功能为中心的设计。使用Haskell时想到的第一件事就是传递元组,因为它们可以在键值对中保存信息,非常像动态语言,但没有像F#类型那样的构造函数语法。
例如,在F#中:
type DatabaseWorkValueItem(firstItem, secondItem, thirdItem) =
member public
我试图检查一个变量是否具有这样的类型:
let s = "abc"
let isString = s :? string
但是在F#交互中,我得到了以下错误:
error FS0016: The type 'string' does not have any proper subtypes and cannot be used as the source of a type test or runtime coercion.
为什么会发生这种情况?我希望isString是个笨蛋。
在F#中,您可以在函数签名上匹配模式。我想用一个函数来装饰一些函数,该函数测量函数的执行情况,并调用statsd。我目前的职能是:
let WrapFunctionWithPrefix(metrics:Metric.Client.IRecorder, functionToWrap, prefix) =
let metricsIdentifier = (sprintf "%s.%s" prefix Environment.MachineName)
using (metrics.StartTimer(metricsIdentifier)) ( fun metrics
在F#中,我使用以下命令解析十进制字符串
let foo str =
match Decimal.TryParse str with
| (true, result) -> Some result
| (false, _) -> None
它使用当前系统区域性来分析字符串。但实际上我想使用CultureInfo.InvariantCulture来解析字符串。这可以像上面那样以模式匹配的方式完成吗?如果不是,最干净的方法是什么?
我确信这与这里正在发生的事情的内部结构有关。希望有人能澄清一下。
我正在访问一个C#友好的库。
我有一个特定的对象充当数组(它是库中用户定义的类型)。在C#中,我可以调用。
myObject[0] = 1
在这样做的过程中我没有错误。
如果我尝试在F#中执行以下操作,我会得到一个错误- The expression was expected to have type float32 but instead has type int.
myObject.[0] <- 1
这是可行的。
myObject.[0] <- float32 1
所以问题是,为什么在C#中这种类型转换是自动发生
虽然我理解中的F#,但我对这种灵活性的好处感到困惑。为什么F#不像C#那样只支持this.Blah,并完成它呢?我猜有些人用它来提高可读性,但即使是这样也有点牵强。那么,这种语言特性的用途/好处是什么呢?
下面是一个定义类型范围内的自标识符" self“和方法作用域标识符"this”的示例。该示例取自上面链接的MSDN文章。
type MyClass2(dataIn) as self =
let data = dataIn
do
self.PrintMessage()
member this.PrintMessage() =
pri
我正在寻找一种在F#中定义无参数lambda表达式的方法,很像下面的C#示例。
var task = () => {
int x = 3;
DoSomething(x);
}
我尝试了以下方法
let task = fun _ ->
let x = 3
doSomething x
它编译,但它给了我task : ('a -> unit),我真正想要的是task : (unit -> uni
我用F#编写了一个简单的函数,并能够从同一解决方案中的另一个项目中的C#代码中正确调用它。然后,我尝试重构,以便我从F#调用的C#函数是原函数部分应用的结果,并接收编译时错误Non-invocable member: 'Calculators.TenPercentCalculator' cannot be used like a method.。
下面是工作的F#:
let TenPercentItemCalculator (paymentItem : PaymentItem) =
1.1M * paymentItem.Amount
let
在C#中,如果委托定义如下:
delegate void A();
A a = () => {Console.WriteLine("Test")};
它可以通过以下方式调用:
a.Invoke(); // Works
a(); // Also works
在F#中,可以调用C#委托:
a.Invoke() // Works fine.
a() // Error: This value is not a function and cannot be applied
为什么我不能在F#中使用第二种方法?在C#中,()操作符是简单地映射到Invoke
我正在尝试学习F#,并且遵循 (第37页,kmeans函数内部):由于我的代码是在F# 4中编写的,因此需要更新以下代码以使用List.item而不是List.nth
let centroids =
let rnd = System.Random()
[ for i in 1 .. clusterCount ->
List.nth data (rnd.Next(data.Length)) ]
它变成了:
let centroids =
let random = System.Random()
[for i in 1 .. clusterC
我开始学F#了。我发现很难改变我对OO编程的看法。我想知道F#开发人员将如何编写以下内容:
“传统”C#
public List<List<string>> Parse(string csvData){
var matrix = new List<List<string>>();
foreach(var line in csvData.Split(Environment.NewLine.ToArray(), StringSplitOptions.None)){
var currentLine = new List&
我使用F#和Foq为C#项目编写单元测试。
我正在尝试设置一个具有out参数的接口的模拟,我甚至不知道如何启动。这可能与代码引号有关,但我的理解到此为止。
接口如下:
public interface IGetTypeNameString
{
bool For(Type type, out string typeName);
}
在C#接口的使用中,如下所示:
[Fact]
public void Foq_Out()
{
// Arrange
var name = "result";
var instance = new Mock<IGet
我在C#代码中声明了两个类:
public class A
{
public static bool TryParse(string value, out A result)
{
...
}
}
public class B : A
{
public static bool TryParse(string value, out B result)
{
...
}
}
而从C#调用B.TryParse是没有问题的,因为正确的重载是由out参数类型决定的,应该提前声明。由于out参数在F#中被转换为结
我正在开发一个新版本的Spiral language,作为它的一个功能,它将具有类似于F#的结构平等和比较。但我很难弄清楚如何高效地将其编译成F#。 问题是我找不到F#如何为它的联合用例公开标记信息。 例如,如果我编写了cmp a b,我希望螺旋编译器生成类似下面这样的F#代码。 type T =
| A of int32
| B of float
let cmp_t = function
| A x, A x' -> cmp_i32 (x, x')
| B x, B x' -> cmp_f64 (x, x')