Какая альтернатива `Seq.contains` не работает при несовпадении типов? - PullRequest
4 голосов
/ 09 июля 2019

Аналогично этому Scala: Почему Seq.contains принимает аргумент Any, а не аргумент типа последовательности?

Если вы делаете Seq(1, 2, 3).contains("dasdas")

Это компилируется и всегда возвращает false.Есть ли альтернатива, которая выдает ошибку типа?Похоже, что это большая проблема, когда contains всегда возвращает false и его очень легко пропустить в обзорах кода.

Ответы [ 2 ]

6 голосов
/ 09 июля 2019

Вы можете включить -Xfatal-warnings и -Ywarn-infer-any, чтобы он не работал при несовпадении типов.
Это также работает для проверок на равенство ==.

Вот пример того, что я используюв моем build.sbt, чтобы избежать странной Скалы, которую вы испытываете:

scalacOptions ++= Seq(
  "-deprecation",
  "-explaintypes",
  "-feature",
  "-language:higherKinds",
  "-unchecked",
  "-Xcheckinit",
  "-Xfatal-warnings",
  "-Xfuture",
  "-Xlint",
  "-Yno-adapted-args",
  "-Ypartial-unification",
  "-Ywarn-dead-code",
  "-Ywarn-inaccessible",
  "-Ywarn-infer-any",
  "-Ywarn-nullary-override",
  "-Ywarn-nullary-unit",
  "-Ywarn-numeric-widen",
  "-Ywarn-unused"
) ++ (
  if (scalaVersion.value.startsWith("2.11")) Seq.empty
  else Seq("-Ywarn-extra-implicit")

Есть замечательная статья от Роба Норриса на следующие темы:
https://tpolecat.github.io/2017/04/25/scalac-flags.html

К вашему сведению: всеобщее равенствобыть заменен на Multiversal равенство в Scala 3 для решения вашей проблемы:
http://dotty.epfl.ch/docs/reference/contextual/multiversal-equality.html

4 голосов
/ 09 июля 2019

Вы можете написать метод расширения, чтобы принимать только определенный тип,

implicit class ListOps[A](list: List[A]) {
  def typeSafeContains(a: A) = list.contains(a)
}

List(1, 2, 3).typeSafeContains(1)
List(1, 2, 3).typeSafeContains("does not work") //type mismatch error;

Не по теме, но я проверил haskell имеет тип безопасности contains

Prelude> elem 1 [1,2,3]
True

Prelude> elem "should not work" [1,2,3]

<interactive>:6:25: error:
    • No instance for (Num [Char]) arising from the literal ‘1’
    • In the expression: 1
      In the second argument of ‘elem’, namely ‘[1, 2, 3]’
      In the expression: elem "should not work" [1, 2, 3]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...