问这个问题是为了澄清我对类型类和更高级别类型的理解,我不是在寻找Java中的变通方法.
在Haskell中,我可以写出像
class Negatable t where
negate :: t -> t
normalize :: (Negatable t) => t -> t
normalize x = negate (negate x)
Run Code Online (Sandbox Code Playgroud)
假设Bool
有一个实例Negatable
,
v :: Bool
v = normalize True
Run Code Online (Sandbox Code Playgroud)
一切正常.
在Java中,似乎不可能声明适当的Negatable
接口.我们可以写:
interface Negatable {
Negatable negate();
}
Negatable normalize(Negatable a) {
a.negate().negate();
}
Run Code Online (Sandbox Code Playgroud)
但是,与Haskell不同,以下不会在没有强制转换的情况下编译(假设MyBoolean
工具Negatable
):
MyBoolean val = normalize(new MyBoolean()); // does not compile; val is a Negatable, not a MyBoolean
Run Code Online (Sandbox Code Playgroud)
有没有办法在Java接口中引用实现类型,或者这是Java类型系统的基本限制?如果是限制,是否与更高级别的支持相关?我认为不是:看起来这是另一种限制.如果是这样,它有名字吗?
谢谢,如果问题不清楚,请告诉我!
我正在尝试翻译以下Java代码:
import java.util.Comparator;
public class ComparatorTestJava {
public static void test() {
Comparator<String> cmp = (s1, s2) -> 0;
cmp = cmp.thenComparing(s -> s);
}
}
Run Code Online (Sandbox Code Playgroud)
进入斯卡拉.我认为这应该有效:
import java.util.{Comparator, function}
object ComparatorTest {
var comparator: Comparator[String] = (t1, t2) ? 0
comparator = comparator.thenComparing(new function.Function[String, String] {
override def apply(t: String): String = t
})
}
Run Code Online (Sandbox Code Playgroud)
但它失败并出现以下错误:
Error:(7, 41) type mismatch;
found : java.util.function.Function[String,String]
required: java.util.Comparator[? >: String]
comparator = comparator.thenComparing(new function.Function[String, String] {
Run Code Online (Sandbox Code Playgroud)
看起来Scala编译器确信我正在尝试使用thenComparing(Comparator)
而不是thenComparing(Function)
.有什么方法可以告诉它它是什么?或者这实际上不是问题?
(我意识到还有其他的,也许更惯用的方法在Scala中构建比较器,但我很想知道为什么会失败.)
我有以下Scala代码:
import java.util.{Comparator, function}
object ComparatorTest {
Comparator.comparing[Int, String](new function.Function[Int, String] {
override def apply(t: Int): String = t.toString
})
}
Run Code Online (Sandbox Code Playgroud)
编译没有问题.我想我应该能够Function
用lambda 替换它(这是我从文档中理解的,至少,IntelliJ是相同的意见).但是,当我用它替换它
Comparator.comparing[Int, String]((t: Int) ? t.toString)
Run Code Online (Sandbox Code Playgroud)
我收到编译器错误:
Error:(6, 23) overloaded method value comparing with alternatives:
(x$1: java.util.function.Function[_ >: Int, _ <: String])java.util.Comparator[Int] <and>
(x$1: java.util.function.Function[_ >: Int, _ <: String],x$2: java.util.Comparator[_ >: String])java.util.Comparator[Int]
cannot be applied to (Int => String)
Comparator.comparing[Int, String]((t: Int) ? t.toString)
Run Code Online (Sandbox Code Playgroud)
(在我看来,第一种选择应该匹配.)
我刚刚问了一个类似的问题,解决方法是明确指定类型参数,但在这种情况下,我认为我已经指定了我能做的一切.是否有另一种使用lambda的解决方案,或者是否需要明确Function
需要?如果是后者,是否有一个文档解释了什么时候lambda可以替代SAM?
我有一个多线程程序,其中一行导致我想静音的警告。我不想让代码中其他任何地方的警告静音。
我可以按照文档中的建议执行此操作:
with warnings.catch_warnings():
warnings.simplefilter("ignore")
line_that_causes_warning()
Run Code Online (Sandbox Code Playgroud)
但是文档也说它不是线程安全的,因为它设置了模块级警告过滤器。
我意识到我可以用一些疯狂的方法来解决这个问题,比如用锁保护这个部分,但是有没有一个很好的方法来使这个线程安全?
我有一个大约有 1M 行和 3 列的数据框(sentence
,一个 100 个字符范围内的lang
字符串,一个 3 个字符的字符串,以及i_sent
一个整数)。
我正在尝试使用名为 的函数生成一个新系列compute_coverage
,该函数接收一个句子及其相应的语言,并返回一个浮点数:
absolute_coverage = df.apply(lambda x: compute_coverage(x['sentence'], x['lang']),
axis=1)
Run Code Online (Sandbox Code Playgroud)
compute_coverage
是一个相当简单的函数,但生成系列需要很长时间(大约 50 秒)。在分析之后(结果如下),事实证明大部分时间都花在了熊猫的get_value
函数上,大概是为了 getx['sentence']
和x['lang']
。
我这样做是不是大错特错?这是预期的吗?有没有更好的方法来执行逐行操作?
谢谢!
编辑:
我想我要说的是有没有办法避免打电话get_value()
?例如,如果我这样做
x = df.apply({'sentence': lambda x: compute_coverage(x, 'fra')})
Run Code Online (Sandbox Code Playgroud)
(这显然返回了错误的结果,但执行了相同的计算量),运行时间减少了 90%。
函数体:
def compute_coverage(sentence, lang):
words = sentence.split()
return len(set(words)) / (lang_vocab[lang] * len(words))
Run Code Online (Sandbox Code Playgroud)
和lang_vocab
是8元字典。
120108317 function calls (114648864 primitive calls) in 150.379 seconds
Ordered by: internal …
Run Code Online (Sandbox Code Playgroud)