【问题标题】:Haskell translate according to dictionaryHaskell根据字典翻译
【发布时间】:2021-09-17 12:40:23
【问题描述】:

我在 Haskell 中输入了代码,在其中一项任务中,我必须根据文件中已有的字典翻译输入的单词。 这是字典中 a 行的示例:

dictionary = [ 
        ("doubleplusgood",["excellent", "fabulous", "fantastic", "best"]),
]

如果输入是“优秀”,任务说我的翻译函数应该返回输出“doubleplusgood”:

translate "excellent" = "doubleplusgood"

我已经尝试解决这个任务好几个小时了,我想我的想法只是绕了一个圈,所以我想知道是否有人对我应该从哪里开始解决这个任务有任何建议?顺便说一句,我不允许导入 Prelude 以外的任何其他包。

【问题讨论】:

  • 这个 q 看起来与 stackoverflow.com/questions/69222788/… 非常相似。你们不是都在做同样的功课吗?你试过什么了?至少你可以告诉我们dictionarytranslate的类型。
  • @AntC,是的,我认为我们正在做同样的任务。字典的类型是字典 :: [([Char], [[Char]])],翻译的类型是 translate :: String -> String。到目前为止我尝试过的是使用“case lookup x dictionary of”,但我不确定我写的是否有意义
  • @AntC 现在阅读该链接后,它们很相似,但这个更清晰。事实上,另一个只是不清楚

标签: haskell


【解决方案1】:

你可以从你已经知道是真的开始,定义

translate "excellent" = "doubleplusgood"

(暂停一下你的怀疑,好吗)。

是的,这是一个有效的定义。但它没有引用dictionary,所以我们可以通过定义来解决这个问题

translate "excellent" = matchup "excellent" dictionary 

matchup "excellent" dict = "doubleplusgood"

当然,它太具体了。所以我们稍微概括为

translate excellent = matchup excellent dictionary 

matchup excellent dict = "doubleplusgood"

现在matchup 只是作弊。我们可以试着让它做一些实际的工作

matchup "excellent" 
  [("doubleplusgood",[ "excellent", "fabulous", "fantastic", "best"])]
  =
    "doubleplusgood"

到目前为止,所有这些变化都只是写下你已经拥有的东西。

但我们之前已经概括了,所以

matchup excellent
  [("doubleplusgood",[ excellent, "fabulous", "fantastic", "best"])]
  =
    "doubleplusgood"

现在这是一个错误。我们的参数中不能出现两次相同的变量。在 Haskell 中是禁止的。所以应该是

matchup excellent1
  [("doubleplusgood",[ excellent2, "fabulous", "fantastic", "best"])]
  =
    "doubleplusgood"

我们肯定会带着这个去某个地方。但是等等,我们根本没有使用这两个变量。它们应该具有相同的,不是吗。所以让我们把它写下来:

matchup excellent1
  [("doubleplusgood",[ excellent2, "fabulous", "fantastic", "best"])]
    | excellent1 == excellent2
  =
    "doubleplusgood"

那么,同义词列表中的所有这些其他条目是怎么回事?还有他们的“翻译”?

matchup excellent1
  [(doubleplusgood,[ excellent2, fabulous, fantastic, best])]
    | excellent1 == excellent2
  =
    doubleplusgood

现在这是一个真正的 Haskell 定义。 几乎。为什么同义词列表应该有这个固定长度?为什么字典中只有一个条目?

我们一厢情愿(谢谢)并写

matchup excellent1 (
   (doubleplusgood, synonyms)
   :
   more )
    | present excellent1 synonyms
  =
    doubleplusgood

现在我们还必须定义这个present。但首先,我们应该如何处理more?在什么条件下?

matchup excellent1 (
   (doubleplusgood, synonyms)
   :
   more )
    | present excellent1 synonyms
  =
    doubleplusgood
    | otherwise
  =
    somethingelse excellent1 more 

但是somethingelse 应该怎么做呢?这不正是matchup 在做什么吗?

等等。等等等等。

我想你可以从这里继续。

【讨论】:

  • 您好,感谢您的帮助,但我不确定是否可以在我的任务中使用此方法,因为我提供的字典非常长,并且为每个实例编写此类代码字典不实用。我想我应该尝试将字典头部第二部分(元素)中的每个元素与我在输入中写的内容进行比较,但我不知道该怎么做。
  • 当然这根本不是我在这里的建议。我向您介绍了一种通过逐渐泛化来开发代码的方法。特别是,带有“more”的最后一位专门处理列表很长的情况。另外,当我将字符串"excellent" 切换为变量excellent 时,您应该意识到变量的名称无关紧要,它可以保存任何值。这就是我切换到显式== 测试的原因。
  • 至于你提到的比较,这是函数present的任务,或者更好的名字是isPresent。事实上,这样的内置函数已经存在。尝试从它的使用上下文中找出它的类型,然后使用hoogle 找到这个函数。如果它不在 Prelude 中,您可以编写它,根据与此 matchup 函数相同的原则:您定义 isPresent a (x:xs) = ....something....isPresent a [] = ....something.... 仅此而已。
猜你喜欢
  • 1970-01-01
  • 2017-10-12
  • 1970-01-01
  • 1970-01-01
  • 2022-01-17
  • 2022-11-30
  • 2018-11-26
  • 2010-12-23
相关资源
最近更新 更多