Там много проблем.
Во-первых, вы не можете сказать game =
что-то и game n =
что-то, поэтому удалите строку game = return ()
. (Возможно, вы пытались написать сигнатуру типа, но это не так.)
Во-вторых, вы не можете использовать синтаксис защиты в произвольных местах. Наиболее близким к тому, что вы написали, являются многофакторные if-выражения , которые позволили бы вам написать следующее:
{-# LANGUAGE MultiWayIf #-}
game n = do putStrLn "guess number: 0-99"
number<-getLine
let y = read number
let x =20
if
| y>x -> putStrLn "your number is greater than x"
| y<x -> putStrLn "your number is less than x"
| y==x-> putStrLn "U win!!"
| otherwise -> game (n-1)
В-третьих, класс типов Ord
должен быть предназначен для типы с полным заказом, поэтому, если вы не используете незаконные вещи, такие как NaN, у вас всегда будет один из y>x
, y<x
или y==x
, поэтому otherwise
никогда не будет введен.
В-четвертых, сравнение с <
, ==
и >
является унидиоматическим c и медленным, поскольку оно должно повторять сравнение. Вместо этого сделайте что-то вроде этого:
case y `compare` x of
GT -> _
LT -> _
EQ -> _