小编McM*_*ons的帖子

F#是否与Haskell相当?

在Haskell中,有一个函数"take n list",它返回列表中的前n个元素.例如,"sum(take 3 xs)"总结了列表xs中的前三个元素.F#有同等价值吗?我希望它是List函数之一,但我找不到任何似乎匹配的东西.

f# haskell list

14
推荐指数
2
解决办法
4552
查看次数

如何使用F#中的类型提供程序连接到SQL Server Compact Edition 4.0?

我正在尝试从F#连接到SQL Server Compact Edition数据库,并尝试使用类型提供程序.这是在Visual Studio 11 Beta中,所以我意识到可能存在一个问题,但我认为我更有可能还没有这方面的技术诀窍.

但是,我注意到Microsoft.FSharp.Data.TypeProviders中没有特定于CE的类型提供程序,我不确定常规SqlDataConnection是否可以解决问题,因此可能就是问题所在.

但是,当我尝试创建连接时,IDE似乎认识到我至少要尝试访问CE数据库.

所以,我有以下代码:

type SqlConnection = 
  Microsoft.FSharp.Data.TypeProviders
    .SqlDataConnection<ConnectionString = @"Data Source=C:\\Path\\Database.sdf">
let db = SqlConnection.GetDataContext()
Run Code Online (Sandbox Code Playgroud)

所以它非常标准,或多或少直接添加新的LINQ to SQL类型提供程序项菜单.

我在连接字符串上找到的工具提示是"Provider'System.Data.SqlServerCe.3.5'未安装." 看起来似乎表明它没有安装Sql Server CE是一个问题,但我有了库,能够使用常规SqlCEConnection连接到数据库并运行SqlCeCommands等.而且由于它是4.0而不是3.5,我不确定它是否正在寻找错误的提供商.我在VS 11 beta中创建了数据库,因此我认为所有版本都应该匹配等等.

简而言之,我想知道我做错了什么,或者VS11 beta类型提供程序库是否还不支持CE 4.0,或者我还需要做些什么来实现它.

谢谢!

f# sql-server-ce type-providers

6
推荐指数
1
解决办法
1341
查看次数

将元组内联作为参数拆分为具有非元组参数的函数

我有一个带两个参数的函数,例如:

let f a b = a = b
Run Code Online (Sandbox Code Playgroud)

然后我有第二个函数返回一个元组:

let g = (a, b)
Run Code Online (Sandbox Code Playgroud)

我想将元组中的a和b作为参数传递到f中的一行.我可以在两个语句中完成它,但我想这样做的原因是我的调用函数执行或者我宁愿不调用f,除非第一种情况是假的,以节省不必要的处理.

let calling =
  someboolean || 
  f g // want to split result of g to parameters for f without calling g twice
Run Code Online (Sandbox Code Playgroud)

关于如何做到这一点的任何提示?我知道我可以选择一个元组,但我想保留currying的选项.

我希望我解释得这么好.:)

f#

5
推荐指数
2
解决办法
675
查看次数

F#类型成员可以互相引用吗?

我想知道是否有办法让类型成员互相引用.我想写下面这样的程序:

type IDieRoller =
    abstract RollDn : int -> int
    abstract RollD6 : int
    abstract RollD66 : int

type DieRoller() =
    let randomizer = new Random()

    interface IDieRoller with
        member this.RollDn max = randomizer.Next(max)
        member this.RollD6 = randomizer.Next(6)
        member this.RollD66 = (RollD6 * 10) + RollD6
Run Code Online (Sandbox Code Playgroud)

但是,这个.RollD66无法看到这个.RollD6.我可以理解为什么,但似乎大多数函数式语言都有一种让函数知道它们提前存在的方法,以便这种或类似的语法成为可能.

相反,我必须做以下事情,这不是更多的代码,但似乎前者看起来比后者更优雅,特别是如果有更多这样的情况.

type DieRoller() =
    let randomizer = new Random()

    let rollD6 = randomizer.Next(6)

    interface IDieRoller with
        member this.RollDn max = randomizer.Next(max)
        member this.RollD6 = rollD6
        member this.RollD66 = (rollD6 * 10) + rollD6 …
Run Code Online (Sandbox Code Playgroud)

f# members

4
推荐指数
2
解决办法
339
查看次数

如何使用Moq模拟使属性在set上抛出异常?

我正在努力获得一些遗留代码,我们正在使用Moq 4进行隔离.有一个类在set {}组件中有一个带有验证的属性.我需要它在调用我的一个测试时抛出一个异常,但我无法做到这一点.我尝试过以下方法:

fakeNetwork
  .Setup(n => n.IpAddress)
  .Throws(new SystemNotFoundException("1.1.1.1");
Run Code Online (Sandbox Code Playgroud)

没有异常被抛出.

fakeNetwork
  .SetupSet(n => n.IpAddress)
  .Throws(new SystemNotFoundException("1.1.1.1");
Run Code Online (Sandbox Code Playgroud)

这种用法已经过时了.替换是.SetupSet(Action),但我不确定如何进行抛出异常的操作.我们将警告视为错误,因此我不知道这是否会起作用,但由于无论如何我都无法使用过时的版本,所以我没有尝试过关闭检查.

任何提示都会非常有用!

c# unit-testing moq mocking

4
推荐指数
1
解决办法
1042
查看次数

我可以在C#中使用未知类型的参数声明方法来创建接口或抽象类吗?

我正在将http GET查询字符串解析为其组件.在尝试使其模块化(参数的数量和类型可以变化很大)时,我希望有一个参数抽象基类或接口来定义是否已设置属性,以及设置方法的Set方法值.有没有办法用Set方法的变量参数类型做到这一点?

总体思路如下:

public abstract class Parameter
{
    public bool IsSet { get; protected set; }
    protected Parameter() { IsSet = false; }
    public abstract void Set( --unknown type here-- );
}
Run Code Online (Sandbox Code Playgroud)

一个示例参数子将是这样的:

public class IntParameter : Parameter
{
    public int Value { get; protected set; }
    public void Set(int value)
    {
        Value = value;
        IsSet = true;
    }
}
Run Code Online (Sandbox Code Playgroud)

通过这种结构,我可以将每个查询参数抛入其适当的强类型类中,但仍然确保所有这些都是一致的.IsSet属性的原因是能够检查参数是否已设置,因为某些参数没有任何"安全"值,我肯定不会故意传递这些值.如果未设置值,则会获得一个默认值.

看看这个问题,我怀疑它是否可以像我想要实现它那样处理,但是这个例子应该能够了解我希望能够做到的事情.

有没有关于如何最好地处理它的建议.如果有一个方便的设计模式或常见的方式,我不会感到惊讶,但我没有设法谷歌一个.

我看到的选项是:

  • 不要使用继承并依赖约定来保持一致性.我很可能不需要通过列表迭代等处理这些,但如果我找到了一种方法,它可能会打开一些新的想法或机会.
  • 使用一个object参数,然后以某种方式做一些typeof()和切换魔法,虽然这让我感到非常难看,而且非多态,可以这么说.

还有其他想法吗?:)

c# inheritance abstract-class interface

3
推荐指数
1
解决办法
1385
查看次数

使用FsUnit创建测试类时,[<Test>]不是成员的有效属性.为什么?

我正在摆弄一个新的F#项目(其中我没有做过很多),我的目标是以TDD方式进行.所以,我正在努力熟悉使用FsUnit,因为我在C#项目中使用NUnit有很多经验,而且它似乎是一个非常常见的框架.

我的代码如下所示:

module DatabaseReaderTest

open NUnit.Framework
open FsUnit

[<TestFixture>]
type DatabaseReaderTest ()=

    [<Test>]
    member x.ResultsAreReturnedFromDatabase =
        DatabaseReader.result.GetSqlString(1) |> should equal "first"
Run Code Online (Sandbox Code Playgroud)

据我所知,这是在FsUnit主页(http://fsunit.codeplex.com/)上的示例,但编译器告诉我这[<Test>]不是这个语言元素的有效属性,我假设它是指会员.

关于我在这里做错了什么提示?

谢谢!

f# fsunit

2
推荐指数
1
解决办法
504
查看次数

为什么这个F#函数的参数值似乎变为0?

我正在尝试编写一个递归函数来构建一个专门的卡片组.第一个参数numOfCards应该是牌组中的牌数.sourceDeck是可用于构建套牌的可能卡的列表,currentDeck是我的累加器,这导致最终的卡列表.

但是,我遇到的问题是,当我为numOfCards发送一个数字值时,它会在match语句中设置为0.或者至少它看起来如何.我尝试使用调试器,当我输入函数时,值是正确的.然而,一旦我开始执行匹配,它突然变为0,如果我将鼠标悬停在匹配中的值和参数中的值(至少是一致的)上.

因此,匹配在0上触发,只返回空的currentDeck,而不是迭代.

关于这个的任何提示?可能是简单的事情,但我很难过.:)

let rec buildDungeon (numOfCards, sourceDeck : List<Card>, currentDeck : List<Card>) =
  match currentDeck.Length with
    | numOfCards  -> currentDeck
    | _           -> buildDungeon (numOfCards, sourceDeck, newCard(sourceDeck)::currentDeck)
Run Code Online (Sandbox Code Playgroud)

parameters f# matching

2
推荐指数
1
解决办法
106
查看次数

如何基于不同的序列生成序列

我有这个序列:

let wheel235 = [4; 2; 4; 2; 4; 6; 2; 6]
let wheel = seq { while true yield! wheel235 }
Run Code Online (Sandbox Code Playgroud)

我想建立一个以特定数字开头的第二个序列,该序列中的每个后续数字都是前一个数字,并且轮子序列中的下一个项目被添加到它.所以,如果我在5开始序列,我将有5,9,11,15,17,21,27等...

我无法完全理解如何去做.

对于那些熟悉它的人来说,它显然是素数生成的一个数字轮,但我不认为知道这对答案很重要.:)

f#

1
推荐指数
1
解决办法
115
查看次数