我想创建一个程序,该程序从标准输入中读取由空格分隔的两个整数。所以我虽然可以将它们存储为字符串。 然后,我想使用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
所以我想知道如何进行这项工作?有没有更好的方法来执行此程序?
答案 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