小编zal*_*ale的帖子

我可以在Java中定义Negatable接口吗?

问这个问题是为了澄清我对类型类和更高级别类型的理解,我不是在寻找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 haskell typeclass

52
推荐指数
4
解决办法
3193
查看次数

Scala在Comparator.thenComparing中解析为错误覆盖

我正在尝试翻译以下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中构建比较器,但我很想知道为什么会失败.)

generics scala scala-java-interop

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

Scala类型检查抱怨lambda,而不是显式函数

我有以下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?

scala

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

Python以线程安全的方式在本地抑制警告

我有一个多线程程序,其中一行导致我想静音的警告。我不想让代码中其他任何地方的警告静音。

我可以按照文档中的建议执行此操作:

with warnings.catch_warnings():
    warnings.simplefilter("ignore")
    line_that_causes_warning()
Run Code Online (Sandbox Code Playgroud)

但是文档也说它不是线程安全的,因为它设置了模块级警告过滤器。

我意识到我可以用一些疯狂的方法来解决这个问题,比如用锁保护这个部分,但是有没有一个很好的方法来使这个线程安全?

python multithreading

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

Pandas 数据框 - 应用 get_value 的性能

我有一个大约有 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)

python pandas

3
推荐指数
1
解决办法
654
查看次数