このコードが機能しないのはなぜですか?
type Test() =
static member func (a: seq<'a seq>) = 5.
let a = [[4.]]
Test.func(a)
次のエラーが発生します。
The type 'float list list' is not compatible with the type 'seq<seq<'a>>'
このコードが機能しないのはなぜですか?
type Test() =
static member func (a: seq<'a seq>) = 5.
let a = [[4.]]
Test.func(a)
次のエラーが発生します。
The type 'float list list' is not compatible with the type 'seq<seq<'a>>'
コードを次のように変更します
type Test() =
static member func (a: seq<#seq<'a>>) = 5.
let a = [[4.]]
Test.func(a)
トリックはのタイプにあります。外側のseqがseq<'a>のインスタンスとseq<'a>のサブタイプを保持できるように明示的に許可する必要があります。#記号を使用すると、これが有効になります。
エラーメッセージは問題を説明しています-F#では、list<list<'a>>
と互換性がありませんseq<seq<'a>>
。
この関数は、を作成することupcast
でこれを回避するのに役立ちます。これは、次のように互換性があります。a
list<seq<float>>
seq<seq<float>>
let a = [upcast [4.]]
Test.func(a)
編集:func
受け入れるタイプをより柔軟にすることができます。オリジナルは、のシーケンスのみを受け入れますseq<'a>
。list<'a>
を実装していてもseq<'a>
、型は同一ではなく、コンパイラーはエラーを出します。
ただし、内部型を次のように記述することにより、そのfunc
型が実装している限り、任意の型のシーケンスを受け入れるように変更できます。seq<'a>
#seq
type Test() =
static member func (a: seq<#seq<'a>>) = 5.
let a = [[4.]]
Test.func(a) // works