小编Gre*_*ley的帖子

如何将Swift协议约束为具体类型?

看看下面的假设代码:

class Stream<S: SequenceType where S.Generator.Element: Character> {
    init(_ sequence: S) {}
}
Run Code Online (Sandbox Code Playgroud)

不编译.我得到"S.Generator.Element约束到非协议类型字符".这真是个无赖,男人.我想到了两种可能性:

class Stream<S: SequenceType where S.Generator.Element: ExtendedGraphemeClusterLiteralType> {
}
Run Code Online (Sandbox Code Playgroud)

这种约束是有效的,因为Character我知道实现该协议的唯一方法.问题是,现在我有一个ExtendedGraphemeClusterLiteralType而不是一个,Character所以我被迫施展,我可以忍受.

另一种可能性就是定义我自己的协议,例如CharacterType,并Character通过扩展实现.(这可能也更安全.)这可能是我实际采取的方法,但我想知道是否有人知道除了这个限制之外的方法吗?

generics swift

7
推荐指数
1
解决办法
2759
查看次数

我应该将REBOL函数称为列表推导?

REBOL没有内置的方法来执行列表推导.但是,REBOL具有强大的功能(称为parse),可用于创建特定于域的语言(DSL).我曾经习惯parse为列表推导创建这样的迷你DSL.为了解释表达式,包含理解的块被传递给一个函数,由于缺少一个我称之为更好的术语comprehend.

例:

comprehend [(a * b) for a in 1x100 for b in 4x10 where (all [odd? a odd? b])]
Run Code Online (Sandbox Code Playgroud)

出于某种原因,comprehend对我来说听起来不对,但是类似的东西eval太笼统了.

我还没有找到任何其他需要关键字或函数用于列表推导的语言.无论它们存在,它们都是纯粹的语法糖.不幸的是我没有这个选择.所以,看到我必须有一个功能,它的优点,简洁,合乎逻辑的名称是什么?

naming list-comprehension rebol dialect

6
推荐指数
1
解决办法
438
查看次数

在Swift中定义CKRecord上的下标时堆栈溢出

这个问题询问是否可以CKRecord在Swift中使用下标.虽然我已经知道如何做提问者想要的东西,但是它的每个排列都会给我一个堆栈溢出:

subscript(key: String) -> CKRecordValue? {
    get {
        return objectForKey(key) as CKRecordValue?
    }
    set {
        setObject(newValue, forKey: key)
    }
}
Run Code Online (Sandbox Code Playgroud)

堆栈溢出发生在getter中.(我从来没有尝试过的制定者,所以它可能有发生了.)我已经试过与实施objectForKey:,objectForKeyedSubscript:以及valueForKey:.所有都产生相同的结果:堆栈溢出.

这很奇怪,因为CKRecord肯定是用Objective-C编写的.为什么它会以递归方式调用Swift的subscript方法?这没有道理.Nate Cook在对提问者的回答中,想知道为什么Swift不会objectForKeyedSubscript:自动桥接.好吧,也许这样做的代码没有完全烘焙,但是导致了这个问题.我将不得不尝试与另一个类objectForKeyedSubscript:.

UPDATE

它似乎objectForKeyedSubscript:通常是桥接的.我使用适当的方法在Objective-C中创建了一个类,将其添加到桥接头,并且索引器在那里编译而没有问题.更好的是,它没有堆栈溢出.

这意味着正在发生一些非常不寻常的事情CKRecord.

一个理论

如果你在Swift中创建一个类,NSObjectsubscript使用a String作为键来实现它的方法,那就变成了objectForKeyedSubscript:.(对于"纯Swift"类,我怀疑情况并非如此.)您可以通过将Swift类导入Objective-C并验证objectForKeyedSubscript:是否存在来验证这一点.

CKRecord下降开始NSObject,实现subscript覆盖默认实现.此外,它似乎objectForKey:valueForKey:所有最终叫objectForKeyedSubscript:,这会导致(读:"是一样的")的调用subscript,这会导致堆栈溢出.

这可以解释为什么发生堆栈溢出.它仍然没有解释为什么objectForKeyedSubscript:没有自动桥接,但也许是因为定义setObject:forKeyedSubscript:与规范的类型签名略有不同:- …

subscript-operator swift cloudkit ckrecord

6
推荐指数
1
解决办法
825
查看次数

如何通过索引从J中的列表中删除元素?

我想出的相当冗长的分叉是

({. , (>:@[ }. ]))
Run Code Online (Sandbox Code Playgroud)

例如,

3 ({. , (>:@[ }. ])) 0 1 2 3 4 5
0 1 2 4 5
Run Code Online (Sandbox Code Playgroud)

效果很好,但是有更惯用的方式吗?在J中这样做的常用方法是什么?

j

6
推荐指数
1
解决办法
144
查看次数

如何重复J中表达式的求值?

给定J中的以下表达式,我该如何执行它n

6?99
Run Code Online (Sandbox Code Playgroud)

我能提出的唯一解决方案是把它变成一个动词很好的动词,但我怀疑有更好的方法:

(3 : '6?99')"0 i.100
Run Code Online (Sandbox Code Playgroud)

现在,在任何人感到困惑之前,这个问题与具体表达无关6?99.这是关于J编程语言的一般问题.你的答案应该足够普遍,适用于任何 J表达式,而不仅仅是6?99.

j

6
推荐指数
1
解决办法
101
查看次数

在J中实现Haskell的foldl1的最有效方法是什么?

在Haskell中,有两个函数允许一个对项列表执行操作,以便将其减少为单个值.(当然,有两个以上,但这些是我感兴趣的两个.)他们是foldl1foldr1.如果要执行的操作是可交换的(例如添加),则使用这些操作无关紧要.结果将是相同的.但是,如果操作不是可交换的(例如,减法),则两者产生非常不同的结果.例如:

foldr1 (-) [1..9]
foldl1 (-) [1..9]
Run Code Online (Sandbox Code Playgroud)

第一个答案是5,第二个答案是-43.J等价物foldr1是插入副词/,例如,

-/ 1+i.9
Run Code Online (Sandbox Code Playgroud)

这相当于foldr1 (-) [1..9].我想在J中创建一个类似于插入副词的副词,但是向左折叠而不是向右折叠.我能想到的最好的是以下内容:

foldl =: 1 : 'u~/@|.'
Run Code Online (Sandbox Code Playgroud)

因此,可以说:

- foldl 1+i.9
Run Code Online (Sandbox Code Playgroud)

并得到-43作为答案,这是左折的预期.

在J中有更好的方法吗?出于某种原因,扭转这一y论点对我来说似乎并不高效.也许有一种方法可以做到这一点,而不必诉诸于此.

j

5
推荐指数
1
解决办法
702
查看次数

在满足某个条件之前,是否有添加到列表的J语言?

想象一下,您使用明显的强力算法生成斐波纳契数.如果我知道我想提前生成的Fibonaccis的数量,我可以使用功率连接做这样的事情^::

(, [: +/ _2&{.)^:20 i.2
Run Code Online (Sandbox Code Playgroud)

当Fibonaccis达到某个极限时,我怎么能停下来1e6呢?(我知道如何在函数内部使用while.,但这没什么好玩的.)

我想强调这是关于J的一般性问题,而不是关于斐波那契的具体问题.斐波那契数字不要太过分心.问题的核心是如何在满足某些条件之前继续追加到列表中.

j

5
推荐指数
2
解决办法
154
查看次数

J中的记忆

每次我使用J的M.副词时,性能都会大幅降低.因为我怀疑艾弗森和慧比我聪明得多,所以我一定做错了.

考虑一下Collat​​z猜想.这里似乎有各种各样的记忆机会,但无论我在哪里M.,表现都很糟糕.例如:

hotpo =: -:`(>:@(3&*))@.(2&|) M.
collatz =: hotpo^:(>&1)^:a:"0
#@collatz 1+i.10000x
Run Code Online (Sandbox Code Playgroud)

没有M.,这在我的机器上运行大约2秒钟.有了M.,好了,我等了十分钟,就完成,最终放弃了.我也放在M.其他位置同样糟糕的结果,例如,

hotpo =: -:`(>:@(3&*))@.(2&|)
collatz =: hotpo^:(>&1)M.^:a:"0
#@collatz 1+i.10000x    
Run Code Online (Sandbox Code Playgroud)

有人可以解释正确的用法M.吗?

j

5
推荐指数
1
解决办法
171
查看次数

如何约束协议类型的参数以符合Swift 4中的AnyObject?

以一个非常接近在下面看一下:

// Note that this protocol can only be applied to reference types.
protocol Ref: class {
  var zibbles: Int { get set }
}

class Reference: Ref {
  var zibbles: Int = 42
}

// Note very carefully that we are NOT passing an
// instance, but a type itself.
func thwip<T: AnyObject>(into target: T.Type) {

}

// This compiles.
thwip(into: Reference.self)

// This fails to compile.
thwip(into: Ref.self) 
Run Code Online (Sandbox Code Playgroud)

无论情况多么罕见,这是语言应该能够完成的事情.编译器知道Ref必须符合的任何实例AnyObject,因此类型约束thwip应该可以工作,但事实并非如此.

请注意,如果我们 …

swift swift-protocols

5
推荐指数
0
解决办法
104
查看次数

使用类型类将值与Haskell中的类型相关联

我想使用类型类来返回一个String功能上依赖于Haskell类型的实例.例如,假设我们有类型Form.我想将字符串"form"与此类型相关联.给定类型Invocation,我想关联字符串"job".等等.重要的是我经常没有相关类型的实例,尽管类型将在任何使用它的函数的类型签名中.

也许一个简单的方法来证明这一点是Swift:

protocol Resource {
  static var resourcePathSegment: String { get }
}

struct Form : Resource {
    static let resourcePathSegment = "form"
}

struct Invocation: Resource {
    static let resourcePathSegment = "job"
}

print(Form.resourcePathSegment)
Run Code Online (Sandbox Code Playgroud)

我为什么要这样的东西?我正在谈论使用某些约定的REST API.对于GET请求,所讨论的资源的路径段在功能上取决于从请求返回的数据的类型.但是,在请求完成之前,我不会有这种类型的实例.

haskell

5
推荐指数
2
解决办法
104
查看次数