如果F#鼓励编写不可变的热切评估数据,那么F#为什么不强制执行简单的let绑定const?
我需要显式写[<Literal>]属性.例如:
module ConstVsStaticReadOnly =
[<Literal>]
let ConstInt32 = 1
[<Literal>]
let ConstString = "A" + "B" + "C"
let staticReadOnlyBoolean = true
Run Code Online (Sandbox Code Playgroud) 我之前从F#Github的一篇文章中读到了一些未使用的保留关键字,例如params,我们应该使用属性.
在" 关键字参考"页面中,我找不到那些已删除的关键字,我可以在哪里搜索它们?
如何在其案例是其他案例的子集的情况下创建OCaml/F#DU类型?
例如,我想创建一个包含不同符号声明类型的符号表,例如程序类型,变量和函数.
乍一看,我可以看到变量包含其类型,函数还包含一个类型和许多参数变量.所以我想使用1 DU,而不是分成许多记录或别名:
type Symbol =
| TypeSymbol of id:string
| VariableSymbol of id:string * type':TypeSymbol
| FunctionSymbol of id:string * params':VariableSymbol list * type':TypeSymbol
Run Code Online (Sandbox Code Playgroud)
但这是错误的,因为DU情况不能是其他情况的子集.如何重新格式化类型以声明DU情况是否相互递归?
我认为模块被编译为静态类.NET IL代码.我可以open命名空间和模块,但为什么不是静态类?
printfn "Hello, World!"
open System.Console
WriteLn("Hello, World!")
Run Code Online (Sandbox Code Playgroud) 借助Visual Studio中的CMake支持,如何运行INSTALL构建?
从顶部工具栏的CMake菜单中,我看不到要运行INSTALL项目的任何选择。
编辑:vre建议的最低设置有效,INSTALL选项显示在工具栏菜单中:
CMakeLists.txt
# 3.9.2 is the current version the newest VS is using
cmake_minimum_required(VERSION 3.9.2)
project(test2017)
add_executable(hello hello.cpp)
install(TARGETS hello DESTINATION hello/bin)
Run Code Online (Sandbox Code Playgroud)你好
但是当我移到hello.cpp子文件夹时,该选项消失了:
CMakeLists.txt
cmake_minimum_required(VERSION 3.9.2)
project(test2017)
add_subdirectory("src")
Run Code Online (Sandbox Code Playgroud)src / CMakeLists.txt
add_executable(hello hello.cpp)
install(TARGETS hello DESTINATION "hello/bin")
Run Code Online (Sandbox Code Playgroud)src / hello.cpp
在阅读F#组件设计指南后,我没有看到任何评论是否应该声明模块及其类型具有相同的名称.
通常我的项目没有任何循环依赖,所以我不需要创建一个新模块(例如InfrastructureTypes或DomainTypes)将每个类型放在一个地方.
例如,如果我有一个记录类型System和一堆函数,我应该把所有内容放在一个模块文件中吗?这是我的尝试:
// System.fs
module System
type rec System =
{ name : string
children : System list }
let init () = { name = ""; children = [] }
let addChild system child =
{ system with system.children = child :: system.children }
let removeChild system child =
let rec removeChild children acc child =
match children with
| c :: children ->
if c <> child then removeChild …Run Code Online (Sandbox Code Playgroud) 例如,我有2个附加功能:
module Add
let add2 a =
let innerFn a = a + 2
innerFn a
let add2' a =
let innerFn' () = a + 2
innerFn' ()
let res1 = add2 0
let res2 = add2' 1
Run Code Online (Sandbox Code Playgroud)
根据我所知,两个innerFns将分别编译为FSharpFunc<int,int>和FSharpFunc<unit,int>,并且每次调用add2或被add2'调用时都会被初始化.
如何重写代码以将它们转换为静态类的静态本地函数(因此没有FSharpFunc初始化),就像在C#7中一样?
单位类型:描述
unit类型,具有一个值并由()表示的类型; 相当于void在C#和NothingVisual Basic中.
它说它们是平等的,但为什么以下比较会返回错误?
typedefof<System.Void> = typedefof<unit>;;
val it : bool = false
Run Code Online (Sandbox Code Playgroud)