4

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))

どうすればこれを回避できますか? 印刷できる独自の関数を作成するには、型とデータのコンストラクターをいじる必要がありますか、それとももっと簡単な方法がありますか?

4

3 に答える 3

14

別のオプション:

data Operation = Add | Subtract | Multiply | Divide deriving (Show)

apply :: Operation -> Double -> Double -> Double
apply Add      = (+)
apply Subtract = (-)
apply Multiply = (*)
apply Divide   = (/)
于 2012-06-09T15:25:53.187 に答える