这question was originally posted by lookatme in the Perl6 IRC channel . 最初的意图是constrain a Callable by using subsets或任何其他可能的方式 . 它适用于签名,但是:
subset WalkCb of Callable where *.signature ~~ :(Int $a);
my WalkCb $x = sub (Int $a) { return $a; };
回报
«Type check failed in assignment to $x; expected WalkCb but got Sub (sub (Int $a) { #`(Sub...) in block <unit> at <tmp> line 1»
声明的其他变体返回类似的消息 . 什么是正确的语法?
2 回答
在这种情况下,似乎解析了
WhateverCode
. 所以如果你在where
中指定一个块:它似乎按预期工作 . 另请注意,我删除了行末尾的
;
,因为行末尾的}
也是语句的结尾 . 我从签名中删除了"a":忽略了签名智能匹配中位置参数的名称 .where
约束可以采用块(lambda)或语句 .问题是
~~
没有参与WhateverCode lambdas的创建(*
)所以你真正在做的是在更大的
where
statement (而不是lambda)中创建*.signature
的lambda .哪个当然永远不会返回
True
,因为lambda具有:(;; $ is raw)
的签名所以只需编写声明表单 . (使用隐式
$_
)