你可以从你已经知道是真的开始,定义
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 在做什么吗?
等等。等等等等。
我想你可以从这里继续。