在Haskell中,有一个函数"take n list",它返回列表中的前n个元素.例如,"sum(take 3 xs)"总结了列表xs中的前三个元素.F#有同等价值吗?我希望它是List函数之一,但我找不到任何似乎匹配的东西.
我正在尝试从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,或者我还需要做些什么来实现它.
谢谢!
我有一个带两个参数的函数,例如:
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的选项.
我希望我解释得这么好.:)
我想知道是否有办法让类型成员互相引用.我想写下面这样的程序:
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) 我正在努力获得一些遗留代码,我们正在使用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),但我不确定如何进行抛出异常的操作.我们将警告视为错误,因此我不知道这是否会起作用,但由于无论如何我都无法使用过时的版本,所以我没有尝试过关闭检查.
任何提示都会非常有用!
我正在将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属性的原因是能够检查参数是否已设置,因为某些参数没有任何"安全"值,我肯定不会故意传递这些值.如果未设置值,则会获得一个默认值.
看看这个问题,我怀疑它是否可以像我想要实现它那样处理,但是这个例子应该能够了解我希望能够做到的事情.
有没有关于如何最好地处理它的建议.如果有一个方便的设计模式或常见的方式,我不会感到惊讶,但我没有设法谷歌一个.
我看到的选项是:
还有其他想法吗?:)
我正在摆弄一个新的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>]
不是这个语言元素的有效属性,我假设它是指会员.
关于我在这里做错了什么提示?
谢谢!
我正在尝试编写一个递归函数来构建一个专门的卡片组.第一个参数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) 我有这个序列:
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# ×7
c# ×2
fsunit ×1
haskell ×1
inheritance ×1
interface ×1
list ×1
matching ×1
members ×1
mocking ×1
moq ×1
parameters ×1
unit-testing ×1