使用Nullable <'a>或使用Option <'a>来表示可为空的int更具惯用性?
在我看来,type参数a可以是包括列表在内的任何东西.为什么这不行?
fun :: a -> a
fun [] = []
Run Code Online (Sandbox Code Playgroud)
Haskell不想编译这段代码.我想知道为什么.
Couldn't match expected type `a' with actual type `[t0]'
`a' is a rigid type variable bound by
the type signature for fun :: a -> a
Run Code Online (Sandbox Code Playgroud)
我可以让它像这样重写签名
fun :: [a] -> [a]
Run Code Online (Sandbox Code Playgroud)
但这不是我想要的东西,因为我想保持函数的多态性.我想知道如何id在空列表上工作.
Prelude> :t id
id :: a -> a
Prelude> id []
[]
Run Code Online (Sandbox Code Playgroud) 我在这做错了什么:
export function fail<a>(problem: SomeProblem): a;
export function fail<a>(message: string): a;
export function fail<a>(messageOrProblem: any): a { throw Error(); }
Run Code Online (Sandbox Code Playgroud)
编译器说:
TS2148: Build: Overload signature is not compatible with function definition.
Run Code Online (Sandbox Code Playgroud) 对我来说,这似乎是一个脑子.我需要从序列中提取包含在Some(x)中的x值.我可以做到
xs |> Seq.fold (fun state x -> match x with -> | Some(y) -> y::state | None -> state) []
|> Seq.toList
|> List.rev
|> List.toSeq
Run Code Online (Sandbox Code Playgroud)
有更好的方法吗?
我在这里找到了以下示例
instance Monad Maybe where
Nothing >>= f = Nothing
(Just x) >>= f = f x
return = Just
Run Code Online (Sandbox Code Playgroud)
该return方法以pointfree样式定义,我知道它适用于函数,但是这里我们有一个数据构造函数,其声明语法看起来与函数不同,更不用说它的用途了.
另一个教程说:
数据构造函数是Haskell中的第一类值,实际上有一个类型.例如,Either数据类型的Left构造函数的类型是:
左:: forall b a.a - > ab
作为第一类值,它们可以被传递给函数,保存在列表中,是其他代数数据类型的数据元素等等.
因此,任何人都可以清楚地知道数据构造函数是什么以及它们与函数的区别(如果有的话).
所以我想为模板绑定创建一个快捷方式,如下所示:
ko.bindingHandlers.shortcut = {
init: function(element, valueAccessor, allBindings, viewModel, bindingContext) {
var data = valueAccessor();
var nextValueAccessor = function () {
return { name: 'someTemplate', data: data };
};
ko.bindingHandlers.template.init.call(this, element, nextValueAccessor, allBindings, viewModel, bindingContext);
}
}
Run Code Online (Sandbox Code Playgroud)
HTML:
<div data-bind="shortcut: 'Hey!'"></div>
<script type="text/html" id="someTemplate">
<div data-bind="text: $data"></div>
</script>
Run Code Online (Sandbox Code Playgroud)
定义了"someTemplate"模板.只是没有说什么就行不通.我在这做错了什么?
我正在讨论是否应该使用类型类或只是创建具有所有必要功能的部分应用程序.
processWith validate accept reject x xs = if validate x then accept x xs else reject x xs
process = processWith (> 0) (\x xs -> x:xs) (\x _ -> error "Unexpected x: " ++ show x)
Run Code Online (Sandbox Code Playgroud)
据我所知,从概念上讲,这只是个人品味的问题.现在我想知道使用currying而不是类型类的性能影响.
谁能解释一下编程语言中的不变量是什么以及它们为什么重要?
这让我发疯了,我已经习惯了 Visual Studio,在那里我可以点击 Escape 并重新开始编辑。VSCode 不会!啊! 有没有办法让它工作?
我最近发现自己在我的代码中反复使用相同的模式.基本上它是访问者模式的变体,我用它来解析对派生类的基类实例的引用.这种方法需要大量的样板代码.
问题:
c# design-patterns programming-languages visitor-pattern multimethod
haskell ×3
f# ×2
c# ×1
data-binding ×1
invariants ×1
javascript ×1
knockout.js ×1
multimethod ×1
typescript ×1
web ×1