小编kae*_*fer的帖子

FsXaml类型提供程序优于XamlReader

F#不支持部分类,也不支持XAML文件的预编译.解决方法:代替编译时代码,在运行时加载图形对象定义.有多种方法可以为XamlReader提供引用的资源文件的内容.

open System.Windows

// from Resource
let uri = System.Uri "pack://application:,,,/AssemblyName;component/MainWindow.xaml"
let info = Application.GetResourceStream uri
let wnd = Markup.XamlReader.Load info.Stream :?> Window

// from Embedded resource
let assembly = System.Reflection.Assembly.GetExecutingAssembly()
let stream = assembly.GetManifestResourceStream "MainWindow.xaml"
let wnd  = Markup.XamlReader.Load stream :?> Window
Run Code Online (Sandbox Code Playgroud)

类型提供程序应该能够将至少部分工作转移回编译时.

open FsXaml
type MainWindow = XAML<"MainWindow.xaml"> 
let mainwnd = new MainWindow()
let wnd = mainwnd.Root
Run Code Online (Sandbox Code Playgroud)

类型安全(和发现)的增益似乎是微不足道的:每个资源的一个运行时类型减少.还有其他优点吗?

xaml f# fsxaml

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

用F#做鱼

Kleisli组合算子>=>,也称为Haskell圈中的"鱼",在需要组合专用函数的许多情况下可能会派上用场.它的工作方式类似于>>运算符,但它不是组合简单的函数,'a -> 'b而是赋予它们一些特殊属性,可能最好表示为'a -> m<'b>,其中m是monad类型或函数返回值的某些属性.

在更广泛的F#社区中这种做法的证据可以在Scott Wlaschin的铁路导向编程(第2部分)中找到,作为返回Result<'TSuccess,'TFailure>类型的函数的组合.

推理哪里有绑定,必须还有鱼,我尝试let (>=>) f g a = f a >>= g用绑定函数本身参数化规范的Kleisli运算符的定义:

let mkFish bind f g a = bind g (f a)
Run Code Online (Sandbox Code Playgroud)

这有点值得注意,通常不应该在面向用户的代码上释放特殊操作符.我可以编写函数返回选项...

module Option =
    let (>=>) f = mkFish Option.bind f
    let odd i = if i % 2 = 0 then None else Some i
    let small i = if abs i > 10 then …
Run Code Online (Sandbox Code Playgroud)

f#

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

F# 通用结构构造函数和错误 FS0670

我在 StackOverflow 中发现了一些有关错误 FS0670 ( This code is not sufficiently generic. ...) 的问题,但所提出的解决方案都不能很好地解决我的问题(我是初学者,也许我错过了 F# 的一些概念)。

我有以下通用结构,我希望仅适用于原始类型(即 int16/32/64 和 single/float/decimal)。

[<Struct>]
type Vector2D<'T when 'T : struct and 'T:(static member get_One: unit -> 'T) and 'T:(static member get_Zero: unit -> 'T) > = 

    val x : 'T
    val y : 'T

    new( xp: 'T, yp: 'T ) = { x = xp; y = yp }
Run Code Online (Sandbox Code Playgroud)

但使用新的构造函数时,我收到提到的错误 FS0670。

有人知道可能的解决方案吗?提前谢谢了。

generics f# constructor struct

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

构建和解构记录

msdn页面记录record expressions了记录构造和record patterns解构的记录(F#)细节,后者没有将它们命名为.这是一个使用两种技术进行算术运算的示例:

// Simple two-dimensional generic vector defintion
type 'a UV =
    { U : 'a; V : 'a }
    static member inline (+) ({ U = au; V = av }, { U = bu; V = bv }) =
        { U = au + bu; V = av + bv }
Run Code Online (Sandbox Code Playgroud)

这看起来很笨拙,而且不太可读.对于解构,有点符号或函数作为替代.由于点符号运算符在spec()的8.4.2 名称解析和记录字段标签部分中有特殊的分配an expression’s type may be inferred from a record label,因此通常无需注释.因此,访问器功能let u { U = …

f#

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

标签 统计

f# ×4

constructor ×1

fsxaml ×1

generics ×1

struct ×1

xaml ×1