OCaml-字符串(程序)

时间:2018-09-30 10:54:52

标签: string ocaml scanf

我想创建一个程序,该程序从标准输入中读取由空格分隔的两个整数。所以我虽然可以将它们存储为字符串。 然后,我想使用String.get之类的东西来获取第一个和第三个字符(用空格分隔的整数),然后将它们打印为整数。

到目前为止,这是我的代码(可能存在语法错误):

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 :(得分:1)

scanf "%s"的类型与您的想法无关。 OCaml中的scanf系列采用参数 functions 来处理给定类型的输入。因此scanf "%s"将函数作为参数。由于您没有传递函数,因此最终会遇到复杂的类型string -> '_a -> '_a

如果您希望函数返回不变的字符串,则可以使用identity函数:

# 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