我想傳遞一個函數:從應用程序A功能與類型不透明的庫,但特定於應用程序
f :: a -> CmdRequest -> (a, CmdResponse)
到系統S.
小號
- 定義CmdRequest和CmdResponse
- 初始化時:給定/商店
f
- 在初始化:存儲的
a
初始值(如一個不透明的值,S不能看到任何a
結構) - 呼叫
f
(如系統操作的一部分) - 傳遞它預先存儲
a
值(從先前的呼叫或系統初始化)返回類型的 - 存儲所得到的第一
a
部件
甲
- 定義
f
- 在初始化:在初始化時通過
f
至S - :傳遞至S
- 的
a
初始值可以使用特定類型a
(例如,Data.HashMap) - 當
f
被稱爲它可以看到內部結構(如Data.HashMap)a
這怎麼可以在Haskell/GHC中完成?
S的狀態是什麼類型的簽名? 我認爲它可以作爲
State a :: ...
一樣簡單,但有沒有辦法隱藏a
? (其中「隱藏」意味着不指定類型參數State
)
我最初嘗試過類型和存在類型,但卡住了。
A S S's State
initialization
. . .
. . .
. . .
| | |
x---------- pass f ----------->| |
| x----- store f -------->|
x--------------- a ----------->| |
| x----- store a -------->|
| |
. .
. .
. .
system operation
| |
| |
x------- get f -------->|
| |
x------- get a -------->|
| |
|<---- call f a CmdRequest ----| |
| | |
|-- return (a', CmdResponse) ->| |
| | |
| x----- store a' ------->|
| | |
. . .
. . .
. . .
|<--- call f a' CmdRequest ----| |
| | |
|- return (a'', CmdResponse) ->| |
| | |
| x----- store a'' ------>|
| | |
. . .
. . .
. . .
爲什麼特別需要做什麼?使用L的API包含函數如'fooWithCallback ::(a - > CmdRequest - >(a,CmdResponse)) - > { - foo actions的類型 - }'有什麼問題? foo動作的類型必須有一個'a'的參數,但它確實不需要任何技巧或努力工作。 –
有關此類API的示例,請查看['atomicModifyIORef'](https://hackage.haskell.org/package/base-4.9.1.0/docs/Data-IORef.html#v:atomicModifyIORef)。它具有類型'IORef a - >(a - >(a,b)) - > IO b',它基本上與'(a - >() - >(a,b)) - > IORef a - > IO b';眯起眼睛,你可以看到'()'是一種(尤其是無聊的)'CmdRequest','b'作爲一種'CmdResponse',和'IORef a - > IO b'作爲foo動作的類型這符合我在之前的評論中提出的形狀。 –
我可以看到沒有問題。請記住,如果A定義了'f'而'CmdRequest'是不透明的,那麼'f'只能使用由L導出的函數來處理它的'CmdRequest'參數。 – chi