有没有办法说明运算符是可交换的,所以我不必为两个方向给出相同的定义?例如:
data Nat = Zero | Succ Nat
(+) :: Nat -> Nat -> Nat
Zero + x = x
x + Zero = x
...
Run Code Online (Sandbox Code Playgroud)
在这里,有没有一种方法可以让我不必同时给出这两种定义,其中一种定义会从另一种定义中暗示出来?有没有办法说明这一点fn = flip fn?
在创建一个快速的iOS应用程序时,我需要在父视图控制器之外处理UIButton印刷机的事件,所以我创建了一个(非常简单的)协议来将该责任委托给另一个类:
import UIKit
protocol MyButtonProtocol {
func buttonPressed(sender: UIButton)
}
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试将addTarget添加到具有该协议的UIButton时,我收到此错误:Cannot convert value of type 'MyButtonProtocol' to expected argument type 'AnyObject?'.不应该有任何东西可以转换成AnyObject??这是我的主要代码:
import UIKit
class MyView: UIView {
var delegate: MyButtonProtocol
var button: UIButton
init(delegate: MyButtonProtocol) {
self.delegate = delegate
button = UIButton()
//... formatting ...
super.init(frame: CGRect())
button.addTarget(delegate, action: "buttonPressed:", forControlEvents: .TouchUpInside)
addSubview(button)
//... more formatting ...
}
}
Run Code Online (Sandbox Code Playgroud)
提前致谢.
对于数据类型构造函数,有没有办法根据构造函数的参数类型以外的条件限制"对象"(我不知道正确的术语)的创建?
例如:
data UInt = UInt Int --the int must be >= 0
Run Code Online (Sandbox Code Playgroud)
确实,我想为矩形多维列表创建一个数据类型(其中所有子列表具有相同的长度).一类或其他技术会更适合这种情况吗?
假设我想删除列表末尾的所有零:
removeEndingZeros :: (Num a, Eq a) => [a] -> [a]
removeEndingZeros (xs ++ [0]) = removeEndingZeros xs
removeEndingZeros xs = xs
Run Code Online (Sandbox Code Playgroud)
由于(++)参数中的运算符,这不起作用.如何通过模式匹配确定列表的结尾?
我写的一些模块经常要复制到其他项目中以重用代码.但是,如果我只是复制模块,那么如果我想要改进它们,我将不得不更新各种git存储库中用于使用它们的项目的所有副本.
好像我应该创建某种类型的库.如何设置我的项目,以便我只需要更新一次这些模块,并且所有依赖它们的存储库都可以访问最新版本?