簡體   English   中英

Seq seq類型作為F#中的成員參數

[英]Seq seq type as a member parameter in F#

為什么這段代碼不起作用?

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) 

訣竅在於a的類型。 您需要明確允許外SEQ持有序列的情況下,<“一個> SEQ亞型<”一個>。 使用#符號啟用此功能。

錯誤消息描述了問題 - 在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實現seq<'a>

type Test() =
  static member func (a: seq<#seq<'a>>) = 5.

let a = [[4.]]
Test.func(a) // works

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM