1
val implies =
    fn x y = case x of false andalso case y of false => true
     | fn x y = case x of false andalso case y of true => true
     | fn x y = case x of true andalso case y of false => false
     | fn x y = case x of true andalso case y of true => true;  

これをコンパイルできません。私はSMLに比較的慣れていないので、一般的な言語と構文を完全には理解していません。私は何を間違えましたか?

4

2 に答える 2

7

さまざまな問題があります。

  • impliesパターンマッチングを直接行うための引数はありません。
  • case x ofif/elseブール式を受け入れる式とは異なり、特定の値とのパターンマッチング用です。
  • ラムダの構文は。で始まる必要がありfn x => ...ます。

簡単な修正:

fun implies x y =
    case (x, y) of
      (false, false) => true
    | (false, true) => true
    | (true, false) => false
    | (true, true) => true

読みやすくするために次のように書き直すことができます。

fun implies false false = true
  | implies false true = true
  | implies true false = false
  | implies true true = true

または命題論理規則を使用してより簡潔に:

fun implies x y = (not x) orelse y
于 2012-04-06T13:28:46.963 に答える
4

匿名関数については、

fun implies x y = (not x) orelse y

次のように書くことができます

val implies = fn x => fn y => (not x) orelse y

ただし、ご覧のとおり、このようにすることは実際には意味がありません(この特定の場合)。

SMLの無名関数は、引数を1つだけ取ります。funキーワードが糖衣構文(派生形式とも呼ばれる)であるため、引数のカリー化は機能します。

val rec implies = fn x => fn y =>
    case (x, y) of
      (x,y) => (not x) orelse y

ケースが使用されるのは、元の関数でパターンマッチングが行われ、それが直接ケースに変換されたrec可能性があるためです。これは、元の関数が再帰的であった可能性があるためです。

したがって、@padが示した2番目の例は次のようになります。

val rec implies = fn x => fn y =>
    case (x, y) of
       (false, false) => true
     | (false, true) => true
     | (true, false) => false
     | (true, true) => true
于 2012-04-06T17:36:37.863 に答える