OCaml - Струны (программа) - PullRequest
       8

OCaml - Струны (программа)

0 голосов
/ 30 сентября 2018

Я хотел создать программу, которая читает из стандартного ввода две целые, разделенные пробелом.Так что я думал, что могу хранить их как строку.Затем я хотел использовать что-то вроде String.get, чтобы получить 1-й и 3-й символы (целые, разделенные пробелом), а затем распечатать их как целые.

Вот мой код (с синтаксическими ошибками, вероятно,):

open Printf
open Scanf


let () = printf "String: "
let str = scanf "%s"


let char1 = String.get str 0
let char3 = String.get str 2

let () = printf "%d %d\n" char1 char3

Я получаю ошибку компилятора.

File "string.ml", line 9, characters 23-26:
Error: This expression has type (string -> 'a) -> 'a
   but an expression was expected of type String

Итак, я хотел знать, как я могу сделать эту работу?Есть ли лучший способ сделать эту программу?

1 Ответ

0 голосов
/ 30 сентября 2018

Тип 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
...