一時的に純粋なデータ構造と線形型:再び


日本語版ははてなブログです.
追加情報.


ピュアを使用しない抜け穴


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