Int.fromString
関数 を使用して文字列から整数値を抽出しようとしていますが、われわれの仕様はString -> int option
です。したがって、Int.fromString
の適用結果はint option
です。しかし、タイプint
の結果が必要です。また、抽出された部分が整数であると確信しています。これはどうすればできますか?SMLで文字列をintに変換する方法(intオプションではなく)
答えて
あなたは、式の左部分にSOME
を自由に使用することが:
val SOME x = Int.fromString "3";
val x = 3 : int
あなたはオプションのSOME値を取得するvalOf
機能を使用することができます。
val i : int = valOf (Int.fromString "1")
これは確かに真実であり、知ることは重要です(つまり+1)が、実際にはvalOfが実際にはほとんど必要ないことは驚くべきことです。良いコードは 'NONE'の可能性を考慮する必要があります。そうする自然な方法はパターンマッチングですが、' SOME x'のようなパターンを使って値を抽出することもできます。 –
私は、APIがそれ自身を消費し、それ以外のケースはありませんが、これが有効であることに気付いています。それはとにかく私が使った場所です。 – eatonphil
@JohnColemanと同様に、
fun intFromString s = let val SOME i = Int.fromString s in i end
fun intFromString s = case Int.fromString s of SOME i => i
fun intFromString s = valOf (Int.fromString s)
のような部分的な機能は推奨できませんあなたの不変の休憩を想定したときに、あなたが簡単にそれを追跡することができますので、それが唯一のプログラマに代わって善意によって支持していますので、あなたは、少なくともエラーが有意義なものにする必要があります。
fun intFromString s =
case Int.fromString s of
SOME i => i
| NONE => raise Fail ("Could not convert string '"^s^"' to int!")
機能Int.fromString : string -> int option
は安全ですが、あなたの場合あなたが行うことができ、それを好きではない:
fun intFromString s default_i =
Option.getOpt (Int.fromString s, default_i)
val intFromString : string -> int -> int
それは自然が呼び出し関数で、または専門のバインド演算子(>>=
)でNONE
を処理するために同じようにすべきです。これは安全な関数と安全でない関数の問題ではなく、API設計に帰着します。
文字列から整数を抽出できることが確実な場合は、この確信度を型に埋め込むことをおすすめします。例えば。これらの文字列を抽象データ型/モジュールにラップすることで、モジュール内からこれらの確かに変換可能な文字列を生成することができます。私はタイプIntString.int_string
の値を作成する唯一の方法はIntString.fromInt
ている知っているので、私はvalOf
の使用を正当化する。この時点で
signature INT_STRING =
sig
type int_string
val fromInt : int -> int_string
val toInt : int_string -> int
val lift : (string -> 'a) -> (int_string -> 'a)
end
structure IntString :> INT_STRING =
struct
type int_string = string
fun fromInt i =
if (i < 0)
then "-"^Int.toString (Int.abs i)
else Int.toString i
fun toInt s =
if String.sub (s, 0) = #"-"
then ~ (valOf (Int.fromString (String.extract (s, 1, NONE))))
else valOf (Int.fromString s)
fun lift f s = f s
end
:最小限の実装は次のようである可能性があります。モジュールは次のように使用できます:
(* This property can be tested for arbitrary inputs i. *)
val id_prop i = IntString.toInt (IntString.fromInt i) = i
val test1 = id_prop 123
val test2 = id_prop ~55
val test3 = id_prop 0
(* Some standard string functions work just as well. *)
val intStringSize = IntString.lift String.size
val intStringPrint = IntString.lift String.print
val test4 = intStringSize (IntString.fromInt 555) = 3
val _ = intStringPrint (IntString.fromInt 12345)
@SimonShineありがとうございました。アイデアはクールです。 –
- 1. intを文字列に変換する方法並列配列
- 2. Swiftオプションの文字列をIntに変換する
- 3. int(x)を使わずに文字列をintに変換する方法
- 4. intを文字列に変換する方法は?
- 5. 文字列^をintに変換する
- 6. intを&文字列に変換する
- 7. C# - 変数の変換方法は? (文字列、int型など)
- 8. 処理中に文字列をintに変換する方法
- 9. int文字列のリスト/タプルをintに変換する
- 10. Pentaho、intを文字列値に変換する方法
- 11. 文字列をintに変換する方法#
- 12. 文字列( "1.0000")をintに変換する方法
- 13. intを文字列に変換する方法(Android)
- 14. 非数値文字列をintに変換する方法
- 15. 文字列をintに変換する短い方法Python 3
- 16. intを文字列に変換してからintに戻す
- 17. 文字列をGolangの[int]文字列に変換する方法
- 18. intを文字列に変換する方法doubleを文字列に変換するには?
- 19. C#で文字列配列をInt配列に変換する
- 20. intを式言語で文字列に変換するには?
- 21. KotlinでIntを16進文字列に変換するには?
- 22. F#文字列をintに変換
- 23. 文字列をintに変換
- 24. オプションへのIntを変換[int]は
- 25. CでASCII文字をint型に変換する方法
- 26. intの文字列であるJSON辞書のキーをintに変換する
- 27. リマインダーのint値を文字列に変換する方法(文字)
- 28. 数字の文字列をJavaのint配列に変換する方法
- 29. Cでは、文字列を数値に変換する方法をint配列に変換しますか?
- 30. ビジュアルベーシックで文字列をint配列に変換しますか?
ありがとう!それは私が必要なものです。 –