为什么不像以下代码一样捕获CTRL-C?
MAXVAL = 10000
STEP_INTERVAL = 10
for i in range(1, MAXVAL, STEP_INTERVAL):
try:
print str(i)
except KeyboardInterrupt:
break
print "done"
Run Code Online (Sandbox Code Playgroud)
我的期望是 - 如果在程序运行时按下CTRL-C,KeyboardInterrupt则应该离开循环.它不是.
对我做错的任何帮助?
我正在构建一个泛型函数,它接受一个HList表单F[T1] :: ... :: F[Tn] :: HNil,将其转换为a F[T1 :: ... :: Tn :: HNil]然后需要将其传递到传入的块中.但是,为了使其工作,我需要提取HList类型那个F[_].我在Shapeless'找到了一些与之相关的东西hlistconstraints:
/**
* Type class witnessing that every element of `L` has `TC` as its outer type constructor.
*/
trait UnaryTCConstraint[L <: HList, TC[_]]
Run Code Online (Sandbox Code Playgroud)
...但这只能用于验证传入的hlist确实是由...组成的F[_]; 然而似乎没有办法提取那个_位,以便对自己的hlist说.
我应该在哪里寻找能够找到工作的东西?或者我不应该期望找到任何开箱即用的东西,而是自己构建类型计算?
披露:这个问题是对包含一些F [_]的元组/ hlist的通用转换/折叠/映射的辅助,但在我看来,它至少与独立问题一样有用.
我是Haskell的新手,并且对如何以最惯用和最清晰的方式表达一些操作感到困惑.目前(还会有更多)我很困惑<*>(我甚至不确定该怎么称呼).
例如,如果我有,比方说
f = (^2)
g = (+10)
Run Code Online (Sandbox Code Playgroud)
作为代表性的功能(实际上它们更复杂,但关键在于它们是不同的和不同的),然后
concatMap ($ [1,2,3,4,10]) [(f <$>), (g <$>) . tail . reverse]
Run Code Online (Sandbox Code Playgroud)
和
concat $ [(f <$>), (g <$>) . tail . reverse] <*> [[1,2,3,4,10]]
Run Code Online (Sandbox Code Playgroud)
完成同样的事情.
是其中一个更惯用的Haskell,是否有人暗示Haskell经验丰富的读者,而另一个则不然.也许有更多(更好)的方式来表达完全相同的东西.这两种方法之间是否存在概念上的差异,像我这样的新手Haskeller可能会丢失?
我知道有两种方法可以将接口规范与Haskell中该接口的实现分开:
类型类,例如:
RandomGenStdGen记录,例如:
Network.TransportNetwork.Transport.TCP问题1:什么时候适合使用其中一种?
问题2:在Haskell中分离接口/ impl有哪些其他方法?
如何将自定义CSS类添加到数据网格中的行(Ext.grid.Panel)?
我正在使用ExtJS 4.0.
我的命名空间目前开始
(ns web.site
(:require ring.adapter.jetty)
(:require ring.middleware.reload)
(:require ring.middleware.stacktrace)
(:require ring.middleware.params)
(:require ring.middleware.keyword-params)
(:require ring.middleware.nested-params)
(:require ring.middleware.multipart-params)
(:require ring.middleware.cookies)
(:require ring.middleware.session)
(:require ring.middleware.session.cookie)
(:require ring.middleware.flash)
(:require ring.middleware.resource)
(:require ring.middleware.file-info))
Run Code Online (Sandbox Code Playgroud)
这里显然有一定的冗余.如何删除它?
当使用以下语法定义启用柯里化的函数时:
def sum(x: Int)(y: Int)(z: Int) = x + y + z
Run Code Online (Sandbox Code Playgroud)
仍然需要在任何对柯里化调用的调用后加上sumwith 的后缀_:
sum _
sum(3) _
sum(3)(2) _
Run Code Online (Sandbox Code Playgroud)
否则编译器会抱怨。
所以我采取了:
val sum = (x: Int) => (y: Int) => (z: Int) => x + y + z
Run Code Online (Sandbox Code Playgroud)
无需_.
现在的问题是:为什么需要多参数列表版本_才能启动柯里化?为什么这两个版本的语义在所有上下文中都不相同?
另外,后一个版本是否会受到某种阻碍?它有任何警告吗?
我开始时有这样的事情:
def nonEmpty[A] = (msg: String) => (a: Option[A]) => a.toSuccess(msg)
val postal: Option[String] = request.param("postal")
val country: Option[String] = request.param("country")
val params =
(postal |> nonEmpty[String]("no postal" )).toValidationNel |@|
(country |> nonEmpty[String]("no country")).toValidationNel
params { (postal, country) => ... }
Run Code Online (Sandbox Code Playgroud)
现在我认为减少样板以获得更好的可读性并且不必向更多的初级团队成员解释什么.toValidateNel和|@|意思是很好的.第一个想法是,List但最后一行将停止工作,我不得不放弃一些静态安全.所以我看向无形:
import shapeless._; import poly._; import syntax.std.tuple._
val params = (
postal |> nonEmpty[String]("no postal"),
country |> nonEmpty[String]("no country")
)
params.map(_.toValidatioNel).reduce(_ |@| _)
Run Code Online (Sandbox Code Playgroud)
然而,我似乎无法超越这.map(...)一点.我按照#scalaz的建议尝试过:
type Va[+A] = Validation[String, A]
type VaNel[+A] …Run Code Online (Sandbox Code Playgroud) 考虑:
trait Validation {
def isValid(str: String): Boolean
}
class AlwaysValid extends Validation {
override def isValid(_: String) = true
}
Run Code Online (Sandbox Code Playgroud)
产量
<console>:1: error: identifier expected but '_' found.
override def isValid(_: String) = true
Run Code Online (Sandbox Code Playgroud)
有什么想法吗?或者这只是语言设计师遗漏的东西?
也许这是关于命名参数传递但这只适用于非覆盖,因为覆盖自动"继承"来自重写方法的参数名称,所以这不可能是:
trait Foo {
def bar(arg0: String): String
}
class Baz extends Foo {
override def bar(blabla: String) = "hello"
}
new Baz().bar(arg0 = "world") // works, even though the arg name is blabla in Baz
Run Code Online (Sandbox Code Playgroud)
此外: _允许在lambda中,甚至多次:
scala> val x: Int => …Run Code Online (Sandbox Code Playgroud) 我的目标是使用不同语言(主要是C,C++,Obj-C和Haskell)的源代码,并告诉他们各种统计数据.(例如,变量,函数,内存分配,复杂性等)
LLVM似乎是一个完美的工具,因为我可以为这些语言生成bitcode,并且使用LLVM的可定制传递,我几乎可以做任何事情.对于C系列它工作正常,以C程序(test.c)为例:
#include <stdio.h>
int main( )
{
int num1, num2, sum;
printf("Enter two integers: ");
scanf("%d %d", &num1, &num2);
sum = num1 + num2;
printf("Sum: %d",sum);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
然后我跑:
clang -emit-llvm test.c -c -o test.bc
opt -load [MY AWESOME PASS] [ARGS]
Run Code Online (Sandbox Code Playgroud)
瞧,我几乎有我需要的一切:
1 instcount - Number of Add insts
4 instcount - Number of Alloca insts
3 instcount - Number of Call insts
3 instcount - Number of Load insts
1 instcount - Number of Ret …Run Code Online (Sandbox Code Playgroud)