Тип scanf "%s"
не то, что вы думаете.Семейство scanf
в OCaml принимает параметры, которые функции для обработки входных данных данного типа.Так что scanf "%s"
принимает функцию в качестве параметра.Поскольку вы не передали функцию, вы получите сложный тип string -> '_a -> '_a
.
Если вы хотите, чтобы функция возвращала строку без изменений, вы можете использовать функцию идентификации:
# let id x = x ;;
val id : 'a -> 'a = <fun>
# let mystring = scanf "%s" id ;;
testing
val mystring : string = "testing"
Вторая проблема в вашем коде заключается в том, что вы обрабатываете тип char
, как если бы он был таким же, как int
.
# printf "%d" '3' ;;
Error: This expression has type char but an expression
was expected of type int
Если вы хотите преобразовать одну цифру в целое число, вы можете использовать эту функцию:
let int_of_char c = Char.code c - Char.code '0'
Однако это не очень надежная функция.
Вероятно, было бы лучше использовать scanf
, чтобы выполнить преобразование в первомместо, которое фактически является его основным назначением.
# let myint = scanf " %d" id ;;
347
val myint : int = 347