一時的に純粋なデータ構造と線形型:再び
日本語版ははてなブログです.
追加情報.
ピュアを使用しない抜け穴
追加情報.
一時的純粋関数データ構造と線形型
岡本和樹・ Dec 28 ' 20・ 3分読む
#haskell
ピュアを使用しない抜け穴
Meh, there is a loophole to escape from the constraint with pure
.
私は不注意にそれを書きました、私はReddit .
I think the solution to the problem with empty
might be to use the Ur
(for "unrestricted") datatype from linear-base:
empty :: (Queue a #-> Ur b) #-> Ur b
Trying to run empty Ur
shouldn't typecheck, because the Ur
constructor is not linear. This seems to be an idiom used in other places of linear-base.
Queue a
は戻り値Ur b
の型を作るためにエスケープできません.Queue a
へのUr
への通過は、Ur :: a -> Ur a
のパラメータが何度も使われるかもしれないので許されません.どのようにスマート!
CPSの必要性
私は、発電機以外の機能(この場合、empty
)がCPSの必要でないとわかりました.
別の線形矢印のパラメータである値に線形矢印を適用すると、その戻り値にも直線性があるようです.私はこれについてのタイピング規則をチェックしなければなりません.
O
IDLの返り値の エーも1回しか使えないという性質を引き継いでるんだな.まあそうじゃないと困るが.
午前5時37分- 2020年12月21日
すなわち、enqueue
等のCPPを作成する必要はない.
null :: Queue a #-> (Ur Bool, Queue a)
null (Queue l m) = (Ur (P.null l), Queue l m)
enqueue :: a -> Queue a #-> Queue a
enqueue a (Queue l m) = check l (a:m)
dequeue :: Queue a #-> (Ur (Maybe a), Queue a)
dequeue (Queue (a:l) m) = (Ur (Just a), check l m)
dequeue (Queue l m) = (Ur Nothing, Queue l m)
ユーザコードは以下の通りです.“let”式を使用することができれば、書き込み/読みやすくなりました.
it "empty → enqueue → dequeue" $ do
let
f :: Queue Int #-> Ur Int
f q =
enqueue 0 q PL.& \q ->
dequeue q PL.& \(Ur (Just a), q) ->
q `lseq` Ur a
Ur a = empty f
a `shouldBe` 0
Reference
この問題について(一時的に純粋なデータ構造と線形型:再び), 我々は、より多くの情報をここで見つけました
https://dev.to/kakkun61/ephemeral-purely-functional-data-structure-and-linear-type-again-4mnm
テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol
Meh, there is a loophole to escape from the constraint with pure
.
I think the solution to the problem with empty
might be to use the Ur
(for "unrestricted") datatype from linear-base:
empty :: (Queue a #-> Ur b) #-> Ur b
Trying to run empty Ur
shouldn't typecheck, because the Ur
constructor is not linear. This seems to be an idiom used in other places of linear-base.
私は、発電機以外の機能(この場合、
empty
)がCPSの必要でないとわかりました.別の線形矢印のパラメータである値に線形矢印を適用すると、その戻り値にも直線性があるようです.私はこれについてのタイピング規則をチェックしなければなりません.
O
IDLの返り値の エーも1回しか使えないという性質を引き継いでるんだな.まあそうじゃないと困るが.
午前5時37分- 2020年12月21日
すなわち、
enqueue
等のCPPを作成する必要はない.null :: Queue a #-> (Ur Bool, Queue a)
null (Queue l m) = (Ur (P.null l), Queue l m)
enqueue :: a -> Queue a #-> Queue a
enqueue a (Queue l m) = check l (a:m)
dequeue :: Queue a #-> (Ur (Maybe a), Queue a)
dequeue (Queue (a:l) m) = (Ur (Just a), check l m)
dequeue (Queue l m) = (Ur Nothing, Queue l m)
ユーザコードは以下の通りです.“let”式を使用することができれば、書き込み/読みやすくなりました. it "empty → enqueue → dequeue" $ do
let
f :: Queue Int #-> Ur Int
f q =
enqueue 0 q PL.& \q ->
dequeue q PL.& \(Ur (Just a), q) ->
q `lseq` Ur a
Ur a = empty f
a `shouldBe` 0
Reference
この問題について(一時的に純粋なデータ構造と線形型:再び), 我々は、より多くの情報をここで見つけました https://dev.to/kakkun61/ephemeral-purely-functional-data-structure-and-linear-type-again-4mnmテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol