Поскольку проверка того, равны ли две функции (программы) для всех входов, не является вычислимой, ваша iden
функция, вероятно, должна будет принимать больше параметров, чем просто две функции, которые она сравнивает.
В общем, ваш iden
будет:
- fun iden f g elem = f(elem) = g(elem)
val iden = fn : ('a -> ''b) -> ('a -> ''b) -> 'a -> bool
В вашем конкретном случае вы, вероятно, захотите сделать что-то вроде этого:
- fun iden f g = let
= fun iden_h f g (a, b) =
= if a > b then iden_h f g (b, a)
= else if a = b then f(a) = g(a)
= else f(a) = g(a) andalso iden_h f g (a+1, b)
= in
= iden_h f g (1, 100)
= end
val iden = fn : (int -> ''a) -> (int -> ''a) -> bool
-
- iden (fn x => x + x) (fn x => 2 * x);
val it = true : bool
- iden (fn x => x + x) (fn x => x * x);
val it = false : bool