【发布时间】:2012-06-14 01:19:03
【问题描述】:
作为一个让我熟悉 Haskell 的简单练习,在 Youtube 上闲逛并偶然发现美国倒计时游戏节目之后,我想为 Numbers 游戏制作一个求解器。
您得到 6 个数字,需要将它们与 (+) (-) (*) (/) 结合才能得到给定的结果。
到目前为止,我得到的是非常脑死亡的,
let operands = [75, 2, 6, 3, 8, 7] :: [Double]
let goal = 623 :: Double
let operations = [(+), (-), (*), (/)]
show (head [(a, x, b, y, c, z, d, t, e) |
a <- operands,
b <- filter (\ q -> q /= a) operands,
c <- filter (\ q -> q /= a && q /= b) operands,
d <- filter (\ q -> q /= a && q /= b && q /= c) operands,
e <- filter (\ q -> q /= a && q /= b && q /= c && q /= d) operands,
x <- operations,
y <- operations,
z <- operations,
t <- operations,
t (z (y (x a b) c) d) e == goal])
...但显然 Show 不知道如何处理函数。
No instance for (Show (Double -> Double -> Double))
arising from a use of `show'
Possible fix:
add an instance declaration for (Show (Double -> Double -> Double))
我该如何解决这个问题?我需要弄乱类型和数据构造函数来制作我自己的可以打印的函数还是有一些更简单的方法?
【问题讨论】:
-
filter (\q -> q /= a && q /= b && q /= c && q /= d)可以写成filter (`notElem` [a,b,c,d]) -
@sdcvvc 这是我以前不知道的反引号的用法。
-
作为教学材料,您可以查看此视频 [Dr. Graham Hutton - 函数式编程基础 - 倒计时问题] (channel9.msdn.com/shows/Going+Deep/…)
-
@badp:这是一个部分,就像
(+3);完整版:filter (\q -> notElem q [a,b,c,d]).
标签: haskell