私はのように見える行動データがあります。F#インターフェイスを関数に渡す方法は?
type IHasShow =
abstract member show:bool
type ShowHideNotCompletedData = {show:bool}
type ShowHideCompletedData = {show:bool}
[<Pojo>]
type ActionData =
| ShowHideNotCompleted of ShowHideNotCompletedData
| ShowHideCompleted of ShowHideCompletedData
その後、私は関数にShowHideNotCompletedDataまたはShowHideCompletedDataに合格しようとしています、機能だけブール「ショー」メンバーの世話が、/キャストを渡す方法を見つけ出すカントをそれ:
let setShowItem (data:IHasShow) negate item =
if data.show && (negate item.completed) then
{ item with show = true}
else if (negate item.completed) then
{ item with show = false}
else
item
しかし、この関数をどのように呼び出すのですか?
let setShowFn = setShowItem (data :> IHasShow) not
エラー:
Type constraint mismatch. The type
'ShowHideNotCompletedData'
is not compatible with type
'IHasShow'
let setShowFn = setShowItem data not
エラーしようとしました:
The type 'ShowHideNotCompletedData' is not compatible with the type 'IHasShow'
はShowHideNotCompletedDataとShowHideCompletedを取ってペーストsetShowItemをコピーするよりも、この他に方法はあります?
役立つ場合は、完全なソースコードはここにある:
let setShowItem show negate item =
if (negate item.completed) then//simplified if statement
{ item with show = show}
else
item
//...
| ShowHideCompleted data ->
let setShowFn = setShowItem data.show id
{ state with
showCompleted = data.show
items = state.items
|> Array.map setShowFn}
私はまだやるジェネリック型を定義し、それを渡す方法を疑問に思う:https://github.com/amsterdamharu/riot_redux_fable
最も簡単な解決策は、データだけブール値を渡さないことでした。
私はインターフェイスの嫌悪にあなたと一緒にいます。あなたのソリューションは、インターフェイスよりも慣れています。私はそれが手元の問題のための最善の解決策であるかどうかはわかりませんが、データ型は非常に複雑に見えますが、OPはあまりコンテキストを提供しませんでした。 –
または 'インライン表示x =(^ T :(メンバーショー:ブール)(x))'型推論FTW :-) – CaringDev