我在F#中编写了一个提供一些按位操作的库¹,我想确保尽可能多的函数是inline使用静态类型参数进行绑定(这允许我编写一个函数并将其用于int16,int32也许甚至bignum只有很少的开销).这条路线肯定无法在某些时候起作用.所述库提供的一些功能有些复杂.
¹注意:我知道通过公共接口公开内联let绑定的问题.
但是,我想把它延伸到最远的程度.现在,我正在尝试以这种形式编写人口计数算法,我正面临一个问题.我不确定如何对掩码进行编码,例如0x3333...,这些算法中出现的掩码.我可以使用一些额外的技巧来绕过移位常数和类似的东西.
有没有我可以使用的技巧,无论是通过F#的类型推断和静态类型参数,还是通过bit-twiddling,以我想要的方式编写算法?有没有什么办法可以在静态泛型函数中编码这些常量?
一个更模糊的问题:我是否可以依赖一些特定的东西来充分利用静态类型参数,尤其是在数值的背景下?例如,我大量使用GenericOne和GenericZero.还有更多这样的事情,我可能错过了吗?
当您在Google中搜索品牌或组织时,通常会获得如下信息块:
http://image.prntscr.com/image/87ff8db6800341d690f79a40468e78b6.png
根据一些研究,我确定此信息来自Google Knowledge Graph API.但是,如果我搜索该品牌或组织,我不会获得社交媒体信息.
潜在地,此信息可以出现在url.sameAs任何实体(Thing类型)的字段下.但是,当我查询Google Knowedge Graph API时,我不会收到以下信息:
GET https://kgsearch.googleapis.com/v1/entities:search?prefix=true&query=Bezeq&key={YOUR_API_KEY}
Run Code Online (Sandbox Code Playgroud)
产量:
"@type": "EntitySearchResult",
"result": {
"@id": "kg:/m/01tjk8",
"name": "Bezeq",
"@type": [
"Corporation",
"Thing",
"Organization"
],
"description": "Telecommunications company",
"image": {
"contentUrl": "http://t0.gstatic.com/images?q=tbn:ANd9GcRybGXwH0QomTkKsrK_Klilh6Pcuj9WS0tqrO_DgBkyX6NbEsvR",
"url": "https://he.wikipedia.org/wiki/%D7%91%D7%96%D7%A7",
"license": "http://creativecommons.org/licenses/by-sa/4.0"
},
"detailedDescription": {
"articleBody": "Bezeq is the largest telecommunications group in Israel. Bezeq and its subsidiaries offer a range of telecom services, including fixed-line, mobile telephony, high-speed Internet, transmission, and pay TV.",
"url": "https://en.wikipedia.org/wiki/Bezeq",
"license": "https://en.wikipedia.org/wiki/Wikipedia:Text_of_Creative_Commons_Attribution-ShareAlike_3.0_Unported_License"
},
"url": …Run Code Online (Sandbox Code Playgroud) 是否有一个函数可以让我连接几个数组,它们之间有分隔符(分隔符也是数组),类似于join工作但不限于字符串?
该函数可以是标准JS或主要库的一部分lodash(这就是它在标签中引用的原因).
以下是一个用法示例:
let numbers = [[1], [2], [3]];
let result = _.joinArrays(numbers, [0]);
console.log(result);
//printed: [1, 0, 2, 0, 3]
Run Code Online (Sandbox Code Playgroud)
这类似于:
let strings = ["a", "b", "c"];
let result = strings.join(",");
console.log(result);
//printed: "a,b,c";
Run Code Online (Sandbox Code Playgroud)
但是,join不能使用,因为它将值转换为字符串,我不想发生.
但它适用于任何类型.
在TypeScript中,我们可以使用字符串文字类型来执行以下操作:
type HelloString = "Hello";
Run Code Online (Sandbox Code Playgroud)
这让我可以定义类似字符串枚举的内容,如下所示:
namespace Literals {
export type One = "one";
export type Two = "two";
}
Run Code Online (Sandbox Code Playgroud)
然后我可以定义一个联合:
type Literal = Literals.One | Literals.Two;
Run Code Online (Sandbox Code Playgroud)
有没有一种方法来提取的独特价值Literals.One作为类型Literals.One?
原因是,当我定义这样的函数时:
function doSomething(literal : Literal) {
}
Run Code Online (Sandbox Code Playgroud)
我真的很想做以下事情:
doSomething(Literals.One);
Run Code Online (Sandbox Code Playgroud)
但我不能.我要写:
doSomething("one");
Run Code Online (Sandbox Code Playgroud) 有没有一种方法可以进行配置npm,以便每当我安装软件包时,它都会:
@types/PACKAGE使用该--save-dev标志安装理想情况下,我希望这能够自动发生(作为插件或其他东西),而不需要编写限制 API 的 shell 脚本。例如,我可能会编写一个 shell 脚本,例如:(请注意,这并不能真正满足所有要求)
#!/bin/bash
npm install --save $1 && npm install --save-dev @types/$1
Run Code Online (Sandbox Code Playgroud)
但这限制了我,因为也许我想要--save-dev这两个包或者想要在命令中使用一些特殊标志。此外,它还创建了对 bash 的依赖,我想避免这种依赖。
或者,如果有一种方法可以制作一个不受这种方式限制的 shellscript,那也可以。
另外,上面的示例实际上并没有检查包是否已经具有类型定义(在这种情况下我不想从下载任何类型定义@types)。
我理解如何在F#中定义和使用活动模式,包括部分活动模式,以及可用的不同类型的模式.例如
let (|Big|Small|) animal = if animal.IsBig then Big(animal) else Small(animal)
let f = function | Big(_) -> "big" |Small(_) -> "small
Run Code Online (Sandbox Code Playgroud)
但是,我很困惑在let绑定,参数和其他地方使用活动模式和有区别的联合.例如,MSDN具有以下代码:
let GetSubstring1 (Slice(p0, p1, text)) =
printfn "Data begins at %d and ends at %d in string %s" p0 p1 text
text.[p0..p1]
Run Code Online (Sandbox Code Playgroud)
这让我有点困惑.
一个具体问题.假设我有歧视的联盟,
type Union = A of int * int | B of int
Run Code Online (Sandbox Code Playgroud)
我可以以某种方式制作一个只接受的功能Union.A,例如
let f (A(a, b)) = a + b
Run Code Online (Sandbox Code Playgroud)
在这种情况下,它告诉我有无与伦比的模式.有没有办法满足它?
我正在尝试定义一个重载的运算符,例如|+|,如下所示:
let inline ( |+| ) (m1 : #IMeasurable) (m2 : #IMeasurable) = m1.Measure + m2.Measure
Run Code Online (Sandbox Code Playgroud)
问题是,我做不了类似的事情:
let three = m1 |+| m2 |+| m3
Run Code Online (Sandbox Code Playgroud)
因为|+|没有为案例定义操作员(m1 : int) (m2 : #IMeasurable).有没有办法重载此运算符或使用静态类型约束使上述表达式成为可能?有没有办法修改IMeasurable(我可以编辑),这是可能的?还有什么能让上面的表达能够起作用?
谢谢.
我正在写一个库,我想要一个类来实现并IReadOnlyList<T>尽可能地使用它.但是,该接口仅在框架版本4.5开始时可用,并且我不希望仅仅因为这个接口而绑定到该版本.
有没有办法我可以自动编译两个版本的库,一个用于4.5(将实现接口,并可能还有一些其他功能),另一个用于3.5?
作为一个例子,我正在寻找像MSBuild配置这样的东西,"在两个[或更多]版本中编译这个库",然后为每个版本指定不同的选项,如定义的符号,框架,引用等.
如果这是可能的,它实际上可以解决我一直遇到的许多其他类似问题.
let ``one`` x = One(x)
type Number =
| One of int
| Two
with
member this.Hi x = ``one`` x
Run Code Online (Sandbox Code Playgroud)
基本上,我想定义一个let引用一个有区别的联合的绑定,我想在它的一个扩展中使用它,因为我知道你不能let出于某种奇怪的原因在联盟内部定义绑定.双重标记用于强调.
实际上,我想要的是为联盟成员制作一种简洁的构造函数.我理解有区别的工会不能有构造函数,但有没有办法做到这一点,也许没有使用let上面的绑定?
我想使用ES6代理来捕获以下常见代码:
for (let key in trapped) {
if (!Object.prototype.hasOwnProperty.call(obj, key)) continue;
let value = trapped[key];
//various code
}
Run Code Online (Sandbox Code Playgroud)
但在查看了代理文档之后,我不知道该怎么做,主要是因为has陷阱陷阱是针对in运算符的,这似乎没有在上面的代码中使用,并且没有hasOwnProperty操作的陷阱.
假设我有以下有区别的联合和价值:
type DisUnion =
| One of string
| Two of string
| Three of string * string
let myVal = One("One")
Run Code Online (Sandbox Code Playgroud)
我知道我可以使用模式匹配来确定myVal属于哪种情况,如下所示:
let whatever (x : DisUnion) = match x with
| One(str) -> "It was One"
| Two(str) - > "It was two"
| Three(str, str) -> "It was three"
Run Code Online (Sandbox Code Playgroud)
但我似乎找不到允许我在没有模式匹配的情况下确定案例标识符的运算符或方法,例如:
let isOne (x : DisUnion) = x :? One //I thought this would work, but it doesn't.
Run Code Online (Sandbox Code Playgroud)
我该怎么做?任何帮助表示赞赏.
f# ×5
.net ×4
javascript ×4
numbers ×2
typescript ×2
arrays ×1
c# ×1
compilation ×1
ecmascript-6 ×1
es6-proxy ×1
generics ×1
google-api ×1
inline ×1
interface ×1
lodash ×1
math ×1
node.js ×1
npm ×1
string ×1
syntax ×1