我想使用静态解析的类型参数和我添加到内置类型的一些扩展方法,比如float32
和int32
,所以我尝试了以下方法:
module Foo =
type System.Single with
static member Bar x = x + 1.0f
let inline bar (x : ^a) =
(^a : (static member Bar : ^a -> ^a) x)
open Foo
[<EntryPoint>]
let main argv =
System.Console.WriteLine (bar 1.0f) (* Compilation fails here *)
0
Run Code Online (Sandbox Code Playgroud)
编译器抱怨说The type 'float32' doesn't support the operator 'Bar'
.我究竟做错了什么?
我开始学习 Haskell,我一直在阅读Haskell wiki 上的这个页面,它报告了这个 qsort 实现:
qsort :: (Ord a) => [a] -> [a]
qsort [] = []
qsort (x:xs) = qsort less ++ [x] ++ qsort more
where less = filter (<x) xs
more = filter (>=x) xs
Run Code Online (Sandbox Code Playgroud)
接着是警告说这不是最有效的方法,并链接了一篇文章,该文章显示了相同算法的极其冗长的版本。只是看着它,我认为那不是我学习 Haskell 的目的,我想在不牺牲其优雅的情况下制作初始 qsort 的更好版本。我主要集中在消除filter
每次调用运行两次的需要,这就是我提出的:
filter' :: (a -> Bool) -> [a] -> ([a], [a])
filter' _ [] = ([], [])
filter' f a = filterInternal a ([], [])
where
filterInternal …
Run Code Online (Sandbox Code Playgroud) 在尝试编译以下代码段时:
type 'a frame = Empty | Frame of string * 'a * 'a frame
let rec searchFrame f s = match f with
| Empty -> None
| Frame(x, val, fr) -> if x == s then
Some(val)
else
searchFrame fr s;;
Run Code Online (Sandbox Code Playgroud)
我Error: Syntax error: pattern expected.
在第二个匹配的情况下得到一个错误,对应于val
.我无法弄清楚我在这里做错了什么:基本上val
应该对应一个类型的值'a
,但我要求我放置一个模式.我怎么解决这个问题?