在C#中,我一直在做SOLID到最近的一个非常极端的水平,并在某种程度上意识到,我现在基本上没有比现在编写函数更多的东西了。 在我最近又开始研究F#之后,我认为这可能是现在我所做的大部分更合适的语言select,所以我想尝试将一个真实世界的C#项目移植到F#作为概念的certificate。 我想我可以把实际的代码(非常不习惯的方式)拉下来,但我无法想象一个架构是什么样子的,这使得我可以像在C#中一样灵活的工作。 我的意思是,我有很多使用IoC容器编写的小类和接口,而且我也使用Decorator和Composite等模式。 这导致(在我看来)非常灵活和可演化的整体架构,允许我轻松地replace或扩展应用程序的任何点的function。 根据所需更改的大小,我可能只需要编写一个新的接口实现,将其replace为IoC注册并完成。 即使变化较大,我可以replace对象图的一部分,而应用程序的其余部分就像以前一样。 现在用F#,我没有类和接口(我知道我可以,但我认为这是在我想要做实际的函数式编程),我没有构造函数注入,我没有IoC容器。 我知道我可以使用更高阶的函数来做类似Decorator模式的事情,但是这看起来不像给构造函数注入类那样具有同样的灵活性和可维护性。 考虑这些C#types: public class Dings { public string Lol { get; set; } public string Rofl { get; set; } } public interface IGetStuff { IEnumerable<Dings> For(Guid id); } public class AsdFilteringGetStuff : IGetStuff { private readonly IGetStuff _innerGetStuff; public AsdFilteringGetStuff(IGetStuff innerGetStuff) { this._innerGetStuff = innerGetStuff; } […]
我试图在gallio-users列表上询问这个问题,但是这个问题没有出现(Google Groups说这个post是成功的)。 我想这个列表可能会被一些不经常阅读他的电子邮件的人所主持:-)看起来像SO有标签为加利奥和MbUnit,我认为这是值得在这里问。 我看到MbUnit的头版提到他们热衷于维护单一的兼容性。 还有一个1 岁以上的用户说,它不能在Linux下工作 我想要testing的项目,如果我删除Parallelizable属性在单声道下编译。 我可以在Linux下启动Gallio控制面板,但不能启动Icarus或Echo。 有没有办法在Linux下运行MbUnittesting? 使用命令行的东西(如Gallio.Echo)并不需要Monodevelop会特别有帮助。
我一直在F#开发一段时间,我喜欢它。 但是我知道F#中不存在的一个stream行词是高级types。 我已经阅读了更高版本的材料,我想我理解他们的定义。 我只是不知道为什么他们有用。 有人可以提供一些在Scala或Haskell中更高级的types变得容易的例子,需要F#中的解决方法吗? 同样对于这些例子,如果没有更高版本的types(或者F#中的反过来),变通方法是什么? 也许我只是习惯于解决这个问题,我没有注意到这个function的缺失。 (我想)我得到的,而不是myList |> List.map f或myList |> Seq.map f |> Seq.toList更高kindedtypes允许您只需编写myList |> map f ,它会返回一个List 。 这很好(假设它是正确的),但似乎有点小气? (并不能简单地通过允许函数重载?)我通常转换为Seq ,然后我可以转换为任何我想要的事情。 再次,也许我太习惯于解决它了。 但是有没有什么例子可以让更高级的types真正的节省你的击键和types安全?
F#有序列 ,允许创build序列: seq { 0 .. 10 } 从0到10创build数字序列。 在C#中有类似的东西吗?
为什么F#和Ocaml(以及其他语言)中的函数不是默认的recursion? 换句话说,为什么语言devise者决定明确地让你在一个声明中inputrec是个好主意: let rec foo … = … 而不是默认给予函数recursion能力? 为什么需要一个明确的rec结构?
我刚刚开始使用F#,我找不到在C#3中进行对象初始化的语法。 即给出这个: public class Person { public DateTime BirthDate { get; set; } public string Name { get; set; } } 我如何在F#中编写以下内容: var p = new Person { Name = "John", BirthDate = DateTime.Now };
试图学习F#,但试图区分折叠和缩小时感到困惑。 折叠似乎做同样的事情,但需要一个额外的参数。 这两个function是否存在合法的原因,或者是否有适应不同背景的人的需要? (例如:C#中的string和string) 这里是从示例复制的代码片段: let sumAList list = List.reduce (fun acc elem -> acc + elem) list let sumAFoldingList list = List.fold (fun acc elem -> acc + elem) 0 list printfn "Are these two the same? %A " (sumAList [2; 4; 10] = sumAFoldingList [2; 4; 10])
我正在写一个JIT编译器的想法,只是想知道是否在理论上可以写在托pipe代码的整个事情。 特别是,一旦你把汇编器生成一个字节数组,你怎么跳到它开始执行?
当我let! read = from.AsyncRead buf let! read = from.AsyncRead buf在F#中,它会阻塞,直到TCP套接字死亡才会返回。 为什么? 我该如何解决? 其代码: module StreamUtil open System.IO /// copy from 'from' stream to 'toStream' let (|>>) (from : Stream) (toStream : Stream) = let buf = Array.zeroCreate<byte> 1024 let rec doBlock () = async { let! read = from.AsyncRead buf if read <= 0 then […]
在F#中,使用pipe道转发运算符|>很常见。 然而,在Haskell中,我只见过函数组合(.)被使用。 我明白,他们是相关的 ,但有没有一个语言的原因,没有在Haskell中使用pipe道转发还是别的东西?