2017-12-29 28 views
2

コンパイラにいくつかのダウンキャストパターン一致警告(FS0025)を無視させるにはどうすればよいですか?同じファイル内の他のFS0025警告をキャプチャする必要がありますか?警告エラーのないダウンキャストユニオンケース

たとえば、最初のパターン一致である(Student studentName) = johnはエラーを起こすことはありませんので、コンパイラで不要な警告を削除します。

type Job = Student of string | Teacher of string 

let john = Student "John" 

(* FS0025: Incomplete pattern matches on this expression. For example, 
the value 'Teacher _' may indicate a case not covered by the pattern(s). *) 
let (Student studentName) = john 
let (Teacher teacherName) = john // runtime error 

私が試した:

#nowarn "25" 
let (Student studentName) = john 
#warn "25" 
let (Teacher teacherName) = john 

しかし、それはlet (Teacher teacherName) = johnのために任意の警告エラーが表示されません。あなたがタイプで、あなたがこのような何か書くことができます使用されたコンストラクタを記録するためにGADTを使用して喜んでいる場合

答えて

2

(OCamlの構文を、私はF#がインストールされていない):

type student 
type teacher 

type _ job = 
    | Student : string -> student job 
    | Teacher : string -> teacher job 

let john = Student "John" 

あなた第一のパターンマッチングは、警告を発することなく受け入れられている(それはトータルである:タイプstudent jobの値が1つのだけコンストラクタがある):

let (Student studentName) = john 

第二つ型チェック時理由で拒否される一方ではstudentteacherは等しくない:

let (Teacher teacherName) = john 

あなたは'a jobから機能を書き込むことによって、すべてのjobの上までの関数を書くことができます。

+1

これは非常に素晴らしい解決策です、悲しいことにF#はGADTをサポートしていません。 – MiP

1

この特定の例では、どちらの場合も、同じデータ、単一の名前の文字列を持っているので、名前を取得するために、あなたはできるパターンマッチ:あなたの場合

let name = match john with Student n | Teacher n -> n 

あなたはタイプのメンバーとしてこれを追加することができます

type Job = 
    | Student of string 
    | Teacher of string 
    member this.Name = match this with Student n | Teacher n -> n 

let john = Student "John" 
let name = john.Name 
1

GADTsにアクセスすることなく、追加のラッパー型の形で余分な定型のビットを追加する必要があります。:「それを何度もするつもり再

type Student = Student of string 
type Teacher = Teacher of string 

type Job = StudentJob of Student | TeacherJob of Teacher 

let john = Student "John" 

let (Student studentName) = john // no warning 
let (Teacher teacherName) = john // compile error 
関連する問題