我正在尝试使用Lift框架反序列化JSON文本,并且它们似乎不支持Seq特征(尽管支持List).举个例子...
一些代表员工的JSON数据(名字和姓氏)......
{"employees":[{"fname":"Bob","lname":"Hope"},{"fname":"Bob","lname":"Smith"}]}
Run Code Online (Sandbox Code Playgroud)
这是员工域对象:
case class Employee(fname: String, lname: String) { }
case class Employees(employees: Seq[Employee]) { }
Run Code Online (Sandbox Code Playgroud)
这是我的JSON反序列化代码......
class EmployeeTest {
@Test def test() {
val jsonText: String = ....
val e = deserialize(jsonText)
}
def deserialize(in: String): Employees = {
implicit val formats = net.liftweb.json.DefaultFormats
net.liftweb.json.Serialization.read[Employees](in)
}
}
Run Code Online (Sandbox Code Playgroud)
如果我将Employees域对象更改为使用List而不是Seq,那么它可以工作.但是如果可以的话,我真的很想使用Seq.
这是我在运行上面的代码时看到的异常(使用Seq):我能做些什么来让它工作吗?谢谢你的帮助!
net.liftweb.json.MappingException: unknown error
at net.liftweb.json.Extraction$.extract(Extraction.scala:43)
at net.liftweb.json.JsonAST$JValue.extract(JsonAST.scala:288)
at net.liftweb.json.Serialization$.read(Serialization.scala:50)
at EmployeeTest.deserialize(EmployeeTest.scala:20)
at EmployeeTest.test(EmployeeTest.scala:13)
Caused by: java.lang.UnsupportedOperationException: tail of empty list
at scala.collection.immutable.Nil$.tail(List.scala:388)
at scala.collection.immutable.Nil$.tail(List.scala:383)
at net.liftweb.json.Meta$Constructor.bestMatching(Meta.scala:60)
at net.liftweb.json.Extraction$.findBestConstructor$1(Extraction.scala:187) …Run Code Online (Sandbox Code Playgroud) 我想我不太明白F#如何推断序列表达式中的类型以及为什么类型不能正确识别,即使我直接从"seq"指定了元素的类型.
在下面的F#代码中,我们有一个基类A和两个派生类,B和C:
type A(x) =
member a.X = x
type B(x) =
inherit A(x)
type C(x) =
inherit A(x)
Run Code Online (Sandbox Code Playgroud)
如果我尝试用简单的序列表达式"产生"它们的实例,我会得到两个错误:
// Doesn't work, but it makes sense.
let testSeq = seq {
yield A(0)
yield B(1) // Error, expected type: A
yield C(2) // Error, expected type: A
}
Run Code Online (Sandbox Code Playgroud)
这是有道理的,因为推断"常见"类型(界面,我认为,可以使这项工作更加困难)可能并不那么简单.但是,可以使用安全转换来修复这些错误:
// Works fine :)
let testSeqWithCast = seq {
yield A(0)
yield B(1) :> A
yield C(2) :> A
}
Run Code Online (Sandbox Code Playgroud)
如果我不想使用演员怎么办?我试图直接从"seq"指定序列类型,但事情似乎不起作用:
// Should work, I think...
let testGenSeq = seq<A> …Run Code Online (Sandbox Code Playgroud) 我应该分割seq<a>成seq<seq<a>>由所述元件的一个属性.如果此属性等于给定值,则必须在该点处"拆分".我怎么能在FSharp中做到这一点?
如果必须在该项目中进行拆分,则将"函数"传递给它并返回bool应该是不错的.
示例:输入序列:seq: {1,2,3,4,1,5,6,7,1,9}
当它等于1时,应在每个项目上进行拆分,因此结果应为:
seq
{
seq{1,2,3,4}
seq{1,5,6,7}
seq{1,9}
}
Run Code Online (Sandbox Code Playgroud) 基本上我想生成一个序列,比如说:
n为2,序列为112
n为3,序列为112123
n为5,序列为112123123412345
我确实想出了一个解决方案
n=5
seq=1
for (i in 2:n){
seq=c(seq,rep(1:n,len=i))
}
Run Code Online (Sandbox Code Playgroud)
我想知道是否有一种方法可以做到没有for循环?
鉴于此代码段:
someFunction x = print x `seq` 1
main = do print (someFunction "test")
Run Code Online (Sandbox Code Playgroud)
代码执行时为什么不print x打印test?
$./seq_test
1
Run Code Online (Sandbox Code Playgroud)
如果我替换它error我可以检查左操作数seq 是否确实被评估.
我怎样才能达到预期的输出:
test
1
Run Code Online (Sandbox Code Playgroud)
只修改someFunction?
在Perl 6中,我可以迭代一个文字序列:
.say for 0 ... 3;
Run Code Online (Sandbox Code Playgroud)
我可以绑定到标量并迭代:
my $s := 0 ... 3;
.say for $s;
Run Code Online (Sandbox Code Playgroud)
但我无法绑定到标量,将其作为参数传递,然后迭代:
my $t := 0 ... 3;
show( $t );
sub show ( $seq ) { .say for $seq }
Run Code Online (Sandbox Code Playgroud)
子例程获取Seq类型的单个元素,但它不会迭代它.
0
1
2
3
0
1
2
3
(0 1 2 3)
Run Code Online (Sandbox Code Playgroud)
在准备参数的过程中有什么东西已遍历所有内容吗?
我想从两个数字创建一个序列,这样一个数字的出现减少(从n_11到1),而另一个数字的出现被固定为n_2.
我一直在寻找并尝试使用seq和rep来做它,但我似乎无法弄明白.
下面是一个例子c(0,1)并且n_1=5,n_2=3:
0,0,0,0,0,1,1,1,0,0,0,0,1,1,1,0,0,0,1,1,1,0,0,1,1,1,0,1,1,1
Run Code Online (Sandbox Code Playgroud)
而这里c(0,1)和n_1=2,n_2=1:
0,0,1,0,1
Run Code Online (Sandbox Code Playgroud) 为什么我不能tail结果tail呢?我可以调用head序列tail返回(和其他变体),但是a tail上的a tail不起作用(在2017.10中):
> my $list = <a b c d e f g h i j>;
(a b c d e f g h i j)
> $list.head(5).head
a
> $list.head(5).tail
e
> $list.tail(5).head
f
Run Code Online (Sandbox Code Playgroud)
这个失败了:
> $list.tail(5).tail
Nil
Run Code Online (Sandbox Code Playgroud)
但扔list在那里工作:
> $list.tail(5).list.tail
j
Run Code Online (Sandbox Code Playgroud) 是否有更惯用的方法将嵌套的序列序列更改为嵌套的集合?
def toNestedSet[T](tsss: Seq[Seq[Seq[T]]]): Set[Set[Set[T]]] =
tsss.map(_.map(_.toSet).toSet).toSet
Run Code Online (Sandbox Code Playgroud)
是否可以实现一个可以处理任何深度列表的函数?
我们知道在F#中,seq是懒惰的评估.我的问题是,如果我有一个数量有限的seq,如何将其转换为包含其所有值的评估数据类型?
> seq { for i in 1 .. 10 do yield i * i };;
val it : seq<int> = seq [1; 4; 9; 16; ...]
Run Code Online (Sandbox Code Playgroud)
非常感谢.