【问题标题】:(Scala) Creating a data structure for English words(Scala) 为英语单词创建数据结构
【发布时间】:2018-07-16 01:12:02
【问题描述】:

我目前正在处理一个涉及使用英语单词的问题。我对函数式编程相当陌生,我想编写尽可能好的代码。这是一个非常简单的问题,但我只想把这个做对!^^

如何为英文单词创建数据结构?我需要它,因为如果我只使用字符串,它的坏处 - 单词中不能有任何数字或任何其他不一致的字符 - 字符串允许它。

我正在考虑创建一个覆盖它的案例类 apply(或构造函数 - 我来自 OP 背景,所以我仍然将它们混合在一起)返回 Either[String, EnglishWord] 的方法,其中 Left 会返回一条错误消息 -类似 - “在你的话中找到一个数字”。我的想法正确吗?有什么建议吗?

-非常感谢!!

干杯=)

【问题讨论】:

  • 我对这种情况下的编译时错误不感兴趣。我只要求一个返回 Either 的数据结构示例
  • 你确定没有包含数字的英文单词吗? “1st”、“2nd”、“3D”和“catch-22”是什么意思?
  • 是的,我错了,但你明白了;D

标签: scala data-structures


【解决方案1】:
  1. 你应该重写apply方法,因为你不能让构造函数返回EnglishWord以外的任何东西。如果需要,您可以将构造函数设为私有,以便人们必须使用 apply 方法。
  2. 您可以使用Try[EnglishWord] 代替Either[String, EnglishWord]
  3. 对于这类事情(将一个类型包装在另一个类型中以确保类型安全),您可能需要value class
  4. 当然,请确保您允许使用诸如“you're”、“ressumé”、“façade”之类的极端词,以及正如 Andrey 指出的那样,允许使用带有数字的词。

这是一个例子:

import scala.util.{ Try, Success, Failure }

case class EnglishWord private(text: String) extends AnyVal

object EnglishWord {
  def apply(text: String): Try[EnglishWord] = {
    if (isValid(text)) {
      Success(new EnglishWord(text))
    } else {
      Failure(new IllegalArgumentException("Invalid word: " + text))
    }
  }

  def isValid(s: String): Boolean = ???
}

【讨论】:

  • 非常感谢!! ^^
猜你喜欢
  • 2018-03-17
  • 1970-01-01
  • 1970-01-01
  • 2019-02-23
  • 1970-01-01
  • 2010-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多