【发布时间】:2014-06-24 01:11:07
【问题描述】:
我知道一点 Prolog,并且刚刚开始在 Haskell 中进行一些自学。我一直在通过99 Problems for Haskell 工作,一路上学到了很多东西,并且非常喜欢 Haskell。有时我试图通过在 Prolog 中编写一些代码来阐明我对问题空间的理解,然后思考该解决方案如何与 Haskell 中的函数式方法相关联。今晚,在处理有关逻辑的问题(问题 47 和 48)时,我分心了,试图完成一个简单的任务,即建立一个包含 n 个值的所有真值组合列表的列表。我想要一个函数tValues :: Int -> [[Bool]]。这个问题可以在 Prolog 中以非常直接和声明式的方式解决,例如:
combinations_of_n_truth_values(N, AllValues) :-
findall(Values, n_truth_values(N, Values), AllValues).
n_truth_values(N, TruthValues) :-
length(TruthValues, N),
maplist(truth_value, TruthValues).
truth_value(true).
truth_value(false).
使用时,变量AllValues 将与所需的真值列表列表统一。我想知道有经验的 Haskell 程序员将如何解决同样的问题。我希望有一个同样直接和声明式的解决方案,但我似乎无法让我的 Haskell 大脑以正确的方式运作。
我已经使用列表推导来摆弄一些半模拟,例如:
tValues:: Int -> [[Bool]]
tValues 0 = []
tValues n = [v:vs | v <- tValue
, vs <- tValues (n-1) ]
tValue :: [Bool]
tValue = [True, False]
但tValues 只返回[]。我想我只需要一些人与人之间的接触来帮助我清醒地摇头,也许能让我有更深入的洞察力。
非常感谢。
【问题讨论】:
标签: haskell prolog combinations list-comprehension translate