我想开始玩f#.什么是F#的CTP?
是否可以用于在vs2008中安装?快递怎么样?
好的,这让我很生气.这段代码怎么可能不起作用?
open System.Collections.Generic
type testing (a:int)=
let test = [Empty]
member p.GetHashCode =
fun () -> printfn "called hash";0
override p.Equals(other:obj) =
printfn "called equals"
true
interface IEquatable<testing> with
override p.Equals(other:testing) =
true
static member op_Equality (other:obj) = printfn "called op" ;true
let dict2 = new Dictionary<testing,int>()
dict2.[(testing 50)] <- 50
dict2.[(testing 50)]
Run Code Online (Sandbox Code Playgroud)
当试图从字典中取出并且不调用任何提供的方法时,代码段就会死掉.我今天只是疯了还是这里有什么问题?
我对 F# 完全陌生,我有一个函数可以计算两个不同点的总和,x如下y所示let vAdd (x1, y1) (x2, y2) : float * float = (x1 + x2, y1 + y2),然后我有另一个函数,它获取点列表,然后用于vAdd进行计算。let vSum [(x1, y1); (x2, y2)] = vAdd (x1, y1) (x2, y2)
现在我的问题是,如果给定的列表为空,我将如何检查并抛出一些错误?我尝试过 if ... then failwith "list is empty"但IsEmpty没有工作。我看过的另一件事是pattern matching,,但我不知道它如何与我的特定功能一起工作。F# 检查列表是否为空
任何帮助将不胜感激,并提前致谢!
我怎样才能以干净的方式实现这样的目标?
让我们想象一下这个简单的代码:
let a () = checkSomeStuff (); None
let b () = do Something (); Some "thing"
let c () = checkSomethingElse (); None
"getOne" {
do! a()
do! b()
do! c()
}
Run Code Online (Sandbox Code Playgroud)
它会返回第一个“Some”。
我可以通过使用 Result 来实现这种确切的行为,其中我通过错误返回值并使用 Ok 继续,但这不可读/不好:
let a () = checkSomeStuff (); Ok ()
let b () = do Something (); Error "thing"
let c () = checkSomethingElse (); Ok ()
result {
do! a()
do! b()
do! c()
}
Run Code Online (Sandbox Code Playgroud)
这是可行的,但我希望在不误用 Result 类型的情况下实现这一目标。用现有的表达方式可以做到吗?
> (Console.Read() = (int 'd'));;
d
val it: bool = true
> (Console.Read() = (int 'd')) && (Console.Read() = (int 'o'));;
val it: bool = false
Run Code Online (Sandbox Code Playgroud)
它似乎在没有调用 Read 的情况下终止,编译器如何知道使表达式为 false?
如何使用显式泛型参数定义 f# 函数?
我尝试过这个:
let my_function<'a 'b> (xs: 'a list) (ys: 'b list) = ....
Run Code Online (Sandbox Code Playgroud)
但它不起作用。
我想要一张 F# 中的地图,但我不知道如何初始化它。两个都
Map.empty.Add("Foo": Map.empty.Add(1: "a").Add(2, "b"))
Run Code Online (Sandbox Code Playgroud)
和
Map.empty.Add("Foo": Map [ (1, "a"); (2, "b") ])
Run Code Online (Sandbox Code Playgroud)
给我语法错误,但这些错误只是意外的符号(这对我没有真正的帮助)或不匹配的括号(但它们是匹配的,所以这一定是因为意外的符号)。那么我该怎么做呢?
谢谢。
我正在尝试将以下模式匹配函数转换为匹配表达式:
let reverse ls =
let rec rev acc =
function
| h :: t -> rev (h :: acc) t
| [] -> acc
rev [] ls
Run Code Online (Sandbox Code Playgroud)
当我尝试转换为等效匹配表达式类型时,会发生不匹配错误:
let reverse ls =
let rec rev acc =
match acc with
| h :: t -> rev (h :: acc) t
| [] -> acc
rev [] ls
Run Code Online (Sandbox Code Playgroud)
两者所需的输出是:
reverse [ 1; 2; 3 ]
// val it : int list = [3; 2; 1]
Run Code Online (Sandbox Code Playgroud) 帮助我弄清楚如何处理文本
我有一个字符串,例如:“word1 number:word2”例如:“结果0:好”或“结果299:坏”
我需要打印未定义/低或高
当 string 为 null 时,打印 Undefined
当数字0-15时,打印Low
当数字 >15 时,打印 High
type GetResponse =
{
MyData: string voption
ErrorMessage: string voption }
val result: Result<GetResponse, MyError>
Run Code Online (Sandbox Code Playgroud)
然后我尝试:
MyData =
match result with
| Ok value ->
if (value.Messages = null) then
ValueSome "result: Undefined"
else
let result =
value.Messages.FirstOrDefault(
(fun x -> x.ToUpperInvariant().Contains("result")),
"Undefined"
)
if (result <> "Undefined") then
ValueSome result
else
errors.Add("We don't have any result")
ValueNone
| Error err ->
errors.Add(err.ToErrorString)
ValueNone
ErrorMessage …Run Code Online (Sandbox Code Playgroud) 下面2个函数
let episodeDict1 (a: obj) =
match a with
| :? (Episode -> _) as generator ->
let episodes = [D; W; M]
let values = episodes |> List.map generator
List.zip episodes values
| :? _ as value -> [D, value; W, value; M, value]
|> dict |> Dictionary
let episodeDict2: obj -> Dictionary<Episode, _> = function
| :? (Episode -> _) as generator ->
let episodes = [D; W; M]
let values = episodes |> List.map generator
List.zip episodes …Run Code Online (Sandbox Code Playgroud)