作为一个让我熟悉 Haskell 的简单练习,在 Youtube 上闲逛并偶然发现 American Countdown 游戏节目之后,我想为 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))
我该如何解决这个问题?我是否需要弄乱类型和数据构造函数来制作我自己的可以打印的函数,还是有一些更简单的方法来解决它?