w 0VS(PBM(FOFSBM1VSQPTF
6MUSBIJHITQFFE
-BSHFTDBMF /VNFSJDBM4PMWFS w (FOFSBM1VSQPTF$BOTJNVMBUF"/:QIZTJDBM QIFOPNFOBFYQSFTTFEBT%J⒎FSFOUJBM&RVBUJPOT w 4QFFE4DBMF#JMMJPODFMMTºWBMTº.4UFQT #GSFFEPNº.JMMJPO4UFQT
w 0VS(PBM(FOFSBM1VSQPTF
6MUSBIJHITQFFE
-BSHFTDBMF /VNFSJDBM4PMWFS w (FOFSBM1VSQPTF$BOTJNVMBUF"/:QIZTJDBM QIFOPNFOBFYQSFTTFEBT%J⒎FSFOUJBM&RVBUJPOT w 4QFFE4DBMF#JMMJPODFMMTºWBMTº.4UFQT #GSFFEPNº.JMMJPO4UFQT w 0VSTPMWFSJTDVSSFOUMZXSJUUFOJO
-JOFTPG)BTLFMM
BOEDPOTJTUTPGQBDLBHFT
0VS(PBMTBOE)BTLFMM w (FOFSBM1VSQPTF4PMWFS w %FQFOEFOU)BTLFMM w 5BHMFTT'JOBMBOE*OJUJBM4UZMF w 4QFFEBOE4DBMF w 1SJNJUJWF.POBET
3FXSJUJOH3VMFT
4QFDJBMJTBUJPO
*OUFSQSPDFTT DPNNVOJDBUJPO w .POBEJD4FRVFODF"CTUSBDUJPOUPNBLFVTFPGUIFTF w 1MVHJOTVTJOH&YUFOTJCMF3FDPSET w "OENBOZPUIFSUFDIOJRVFTOPUNFOUJPOFEUIJTUBML &YQSFTTJWJUZ4BGFUZ .PEVMBSJUZ &YUFOTJCJMJUZ
0VS(PBMTBOE)BTLFMM w (FOFSBM1VSQPTF4PMWFS w %FQFOEFOU)BTLFMM w 5BHMFTT'JOBMBOE*OJUJBM4UZMF w 4QFFEBOE4DBMF w 1SJNJUJWF.POBET
3FXSJUJOH3VMFT
4QFDJBMJTBUJPO
*OUFSQSPDFTT DPNNVOJDBUJPO w .POBEJD4FRVFODF"CTUSBDUJPOUPNBLFVTFPGUIFTF w 1MVHJOTVTJOH&YUFOTJCMF3FDPSET w "OENBOZPUIFSUFDIOJRVFTOPUNFOUJPOFEUIJTUBML &YQSFTTJWJUZ4BGFUZ
&YBNQMFT#PVOEBSZ4BOJUZ BOE2VBOUJUZ/BNF w 8FUSFBUTPNBOZEJ⒎FSFOULJOETPGRVBOUJUJFT w WFMPDJUZ
UFNQFSBUVSF
FMFDUSJDDIBSHF w 4PNFPGUIFNTIBSFTUIFTBNFSFQSFTFOUBUJPO
CVUUIFZ BSFDPNQMFUFMZEJ⒎FSFOURVOBUJUJFT
&YBNQMFT#PVOEBSZ4BOJUZ BOE2VBOUJUZ/BNF w 8FUSFBUTPNBOZEJ⒎FSFOULJOETPGRVBOUJUJFT w WFMPDJUZ
UFNQFSBUVSF
FMFDUSJDDIBSHF w 4PNFPGUIFNTIBSFTUIFTBNFSFQSFTFOUBUJPO
CVUUIFZ BSFDPNQMFUFMZEJ⒎FSFOURVOBUJUJFT w "OEUIFZSFRVJSFTEJ⒎FSFOUQSFQSPDFTTJOHPGCPVOEBSZ WBMVFTUPFOGPSDFJOWBSJBOUT
&YBNQMFT#PVOEBSZ4BOJUZ BOE2VBOUJUZ/BNF w 8FUSFBUTPNBOZEJ⒎FSFOULJOETPGRVBOUJUJFT w WFMPDJUZ
UFNQFSBUVSF
FMFDUSJDDIBSHF w 4PNFPGUIFNTIBSFTUIFTBNFSFQSFTFOUBUJPO
CVUUIFZ BSFDPNQMFUFMZEJ⒎FSFOURVOBUJUJFT w "OEUIFZSFRVJSFTEJ⒎FSFOUQSFQSPDFTTJOHPGCPVOEBSZ WBMVFTUPFOGPSDFJOWBSJBOUT w 1SPDFTTFEWBMVFTNVTUOPUCFBEEFENVMUJQMJFEXJUIPUIFS WBMVFT
CFDBVTFJUDBOWJPMBUFJOWBSJBOUT
&YBNQMFT#PVOEBSZ4BOJUZ BOE2VBOUJUZ/BNF w 8FUSFBUTPNBOZEJ⒎FSFOULJOETPGRVBOUJUJFT w WFMPDJUZ
UFNQFSBUVSF
FMFDUSJDDIBSHF w 4PNFPGUIFNTIBSFTUIFTBNFSFQSFTFOUBUJPO
CVUUIFZ BSFDPNQMFUFMZEJ⒎FSFOURVOBUJUJFT w "OEUIFZSFRVJSFTEJ⒎FSFOUQSFQSPDFTTJOHPGCPVOEBSZ WBMVFTUPFOGPSDFJOWBSJBOUT w 1SPDFTTFEWBMVFTNVTUOPUCFBEEFENVMUJQMJFEXJUIPUIFS WBMVFT
CFDBVTFJUDBOWJPMBUFJOWBSJBOUT 4MPHBO)VNBOTGPSHFU-FUUZQFTSFNFNCFS
5BHHJOHXJUI2VBOUJUZ/BNFBOE 4BOJUZ w TagQty name s: BRVBOUJUZOBNFEnameXJUIQSPDFTTFETUBUFs. w *OUIJTXBZ
BUZQFEFQFOETPOWBMVFTnameBOETBOJUZ :FU%POF B %FQFOEFOU5ZQF w 8FDBOVTF,OPXO/BUMJLFDPOTUSBJOUTUPSFJGZUZQFMFWFMWBMVFTUPFYQSFTTJPO w 4JODFXFXBOUUPBMMPXPQFSBUJPOTPOMZPOYetRVBOUJUJFT
XFQSPWJEFNumsPOMZ GPSYets
BOEIJEFDPOTUSVDUPSTGSPNPUIFSNPEVMFT w /VNJOTUBODFJTJOEFQPGLBOEOBNF
XFDBOKVTUXSJUFBQPMZNPSQIJDJOTUT data Sanity = Yet | Done newtype TagQty name (s Sanity) = TQty { unTagQty PhysQty } unproc TagQty k t 'Done TagQty t 'Yet class Processable env k name where process env PhysQty TagQty name 'Done instance s ~ 'Yet Num (TagQty k name s)
4VNNBSZ-FU5ZQFT 3FNFNCFS w )VNBOTGPSHFUJOWBSJBOUT-FUUZQFTSFNFNCFS w 8JUI%BUB,JOET
POFDBOFOGPSDFJOWBSJBOUTTUBUJDBMMZ
BUUZQF MFWFM BMMPXTPQFSBUJPOTPOMZPOUIFTBNFEFHT
POMZPO VOQSPDFTTFERUZT
BOETPPO
w 4VDIQBSBNFUFSTXIJDIEPFTOUPDDVSJOBDUVBMWBMVFJTDBMMFE QIBOUPNUZQFT w ()$JTOPUTPDMFWFSUPTPMWFUSJWJBMDPOTUSBJOUT
CVUPOFDBOBVHNFOU UIFNXJUIUZQFDIFDLFSQMVHJOT
4VNNBSZ-FU5ZQFT 3FNFNCFS w )VNBOTGPSHFUJOWBSJBOUT-FUUZQFTSFNFNCFS w 8JUI%BUB,JOET
POFDBOFOGPSDFJOWBSJBOUTTUBUJDBMMZ
BUUZQF MFWFM BMMPXTPQFSBUJPOTPOMZPOUIFTBNFEFHT
POMZPO VOQSPDFTTFERUZT
BOETPPO
w 4VDIQBSBNFUFSTXIJDIEPFTOUPDDVSJOBDUVBMWBMVFJTDBMMFE QIBOUPNUZQFT w ()$JTOPUTPDMFWFSUPTPMWFUSJWJBMDPOTUSBJOUT
CVUPOFDBOBVHNFOU UIFNXJUIUZQFDIFDLFSQMVHJOT w /PUFGPS1SPGFTTJPOBMT8FBSFUSZJOHIBSEUPBWPJEUPVTFTJOHMFUPOT
0VS(PBMTBOE)BTLFMM w (FOFSBM1VSQPTF4PMWFS w %FQFOEFOU)BTLFMM w 5BHMFTTpOBMBOE*OJUJBM4UZMF w 4QFFEBOE4DBMF w 1SJNJUJWF.POBET
3FXSJUJOH3VMFT
4QFDJBMJTBUJPO
*OUFSQSPDFTT DPNNVOJDBUJPO w .POBEJD4FRVFODF"CTUSBDUJPOUPNBLFVTFPGUIFTF w 1MVHJOTVTJOH&YUFOTJCMF3FDPSET w "OENBOZPUIFSUFDIOJRVFTOPUNFOUJPOFEUIJTUBML &YQSFTTJWJUZ4BGFUZ
0VS(PBMTBOE)BTLFMM w (FOFSBM1VSQPTF4PMWFS w %FQFOEFOU)BTLFMM w 5BHMFTTpOBMBOE*OJUJBM4UZMF w 4QFFEBOE4DBMF w 1SJNJUJWF.POBET
3FXSJUJOH3VMFT
4QFDJBMJTBUJPO
*OUFSQSPDFTT DPNNVOJDBUJPO w .POBEJD4FRVFODF"CTUSBDUJPOUPNBLFVTFPGUIFTF w 1MVHJOTVTJOH&YUFOTJCMF3FDPSET w "OENBOZPUIFSUFDIOJRVFTOPUNFOUJPOFEUIJTUBML .PEVMBSJUZ
.POBEEFMJNJUTUBTLT w "GUFSBMNPTUIBMGBOZFBS
UIFTUSVDUVSFIBTDIBOHFEUJNFCZUJNF w #VUUIFTUBUFNFOUDBOTUJMMIPMEUSVFJOBTFOTF w 5ZQF$MBTTFT
GPMMPXJOHUBHMFTTpOBMBQQSPBDI
BCTUSBDUT FBDITFQBSBUFUBTLT
.POBEEFMJNJUTUBTLT w "GUFSBMNPTUIBMGBOZFBS
UIFTUSVDUVSFIBTDIBOHFEUJNFCZUJNF w #VUUIFTUBUFNFOUDBOTUJMMIPMEUSVFJOBTFOTF w 5ZQF$MBTTFT
GPMMPXJOHUBHMFTTpOBMBQQSPBDI
BCTUSBDUT FBDITFQBSBUFUBTLT w %J⒎FSFOUJBMPQFSBUJPOT
DBMDVMBUJPOTDIFNBUB
*0
.POBEEFMJNJUTUBTLT w "GUFSBMNPTUIBMGBOZFBS
UIFTUSVDUVSFIBTDIBOHFEUJNFCZUJNF w #VUUIFTUBUFNFOUDBOTUJMMIPMEUSVFJOBTFOTF w 5ZQF$MBTTFT
GPMMPXJOHUBHMFTTpOBMBQQSPBDI
BCTUSBDUT FBDITFQBSBUFUBTLT w %J⒎FSFOUJBMPQFSBUJPOT
DBMDVMBUJPOTDIFNBUB
*0
w &RVBUJPOXSJUFSTIBTUPDBSFBCPVUPOMZBCTUSBDUEJ⒎FSFOUJBM PQFSBUJPOTPOMZ
.POBEEFMJNJUTUBTLT w "GUFSBMNPTUIBMGBOZFBS
UIFTUSVDUVSFIBTDIBOHFEUJNFCZUJNF w #VUUIFTUBUFNFOUDBOTUJMMIPMEUSVFJOBTFOTF w 5ZQF$MBTTFT
GPMMPXJOHUBHMFTTpOBMBQQSPBDI
BCTUSBDUT FBDITFQBSBUFUBTLT w %J⒎FSFOUJBMPQFSBUJPOT
DBMDVMBUJPOTDIFNBUB
*0
w &RVBUJPOXSJUFSTIBTUPDBSFBCPVUPOMZBCTUSBDUEJ⒎FSFOUJBM PQFSBUJPOTPOMZ w #BDLFOE 4PMWFS XSJUFSTDBOJNQMFNFOUUIFNDPODSFUFMZ
MFBWJOHFRVBUJPOTUIFNTFMWFTVOUPVDIFE
5BHMFTT'JOBM4UZMF<> data family PhysQty m class Monad m MonadDiff m where grad PhysQty m m (PhysQty m) div PhysQty m m (PhysQty m) w "CTUSBDUDPNNPOPQFSBUJPOBTBNPOBEJDGVODUJPO w "DUVBMMZ
diffOFFETTPNFHFPNFUSJDJOGPBTBOFYUSBBSHVNFOU
CVUJUJTIJEEFOJOMonadic value m w 5IJTIJEFTUIFJNQMEFUBJMPGEJ⒎PQTBOEFOBCMFTVTUPTFQBSBUFJNQM GSPNBCTUSBDUFRVBUJPOT5IJTFODPVSBHFTNPEVMBSJUZBOEHFOFSBMJUZ
0VUDPNFNVMUJQMF CBDLFOET w 0OFDBOJNQMFNFOUBOETXJUDINVMUJQMFTPMWFSTFBTJMZ w 8JUIPVUSFXSJUJOHUIFFYJTUJOHEJ⒎FSFOUJBMFRVBUJPOT w $VSSFOUMZXFIBWF4PMWFSTJTPNPSQIJDUPQVSFReader envBOEReaderT env IO
0VUDPNFNVMUJQMF CBDLFOET w 0OFDBOJNQMFNFOUBOETXJUDINVMUJQMFTPMWFSTFBTJMZ w 8JUIPVUSFXSJUJOHUIFFYJTUJOHEJ⒎FSFOUJBMFRVBUJPOT w $VSSFOUMZXFIBWF4PMWFSTJTPNPSQIJDUPQVSFReader envBOEReaderT env IO w 5IFMBUUFSJTDBMMFE3*0QBUUFSOJO)BTLFMMDPNNVOJUZ
0VUDPNFNVMUJQMF CBDLFOET w 0OFDBOJNQMFNFOUBOETXJUDINVMUJQMFTPMWFSTFBTJMZ w 8JUIPVUSFXSJUJOHUIFFYJTUJOHEJ⒎FSFOUJBMFRVBUJPOT w $VSSFOUMZXFIBWF4PMWFSTJTPNPSQIJDUPQVSFReader envBOEReaderT env IO w 5IFMBUUFSJTDBMMFE3*0QBUUFSOJO)BTLFMMDPNNVOJUZ w (JWFTVTVOJGPSNUSFBUNFOUGPSCPUIJNNVUBCMF TUBUFTZFUSFUBJOJOHUISFBEBOEFYDFQUJPOTBGFUZ
0VUDPNFNVMUJQMF CBDLFOET w 0OFDBOJNQMFNFOUBOETXJUDINVMUJQMFTPMWFSTFBTJMZ w 8JUIPVUSFXSJUJOHUIFFYJTUJOHEJ⒎FSFOUJBMFRVBUJPOT w $VSSFOUMZXFIBWF4PMWFSTJTPNPSQIJDUPQVSFReader envBOEReaderT env IO w 5IFMBUUFSJTDBMMFE3*0QBUUFSOJO)BTLFMMDPNNVOJUZ w (JWFTVTVOJGPSNUSFBUNFOUGPSCPUIJNNVUBCMF TUBUFTZFUSFUBJOJOHUISFBEBOEFYDFQUJPOTBGFUZ w 8FVTFDerivingViaUPSFEVDFCPJMFSQMBUFDPEFTGPS TVDIJOTUBODFT
1SPCMFN5PP.VDI#JOET w 8FVTF("%5T JOJUJBMSFQS UPQSPWJEFTNBSU DPOTUSVDUPST w 5IFZBMTPUBLFTDBSFPGBEEJUJPOBMQSFQPTU QSPDFTTFTGPSFBDIEJ⒎FSFOUJBMPQFSBUPST ν △ u − 1 ρ grad P (-) ((nu *) laplacian u) ((/rho) grad u)
*OJUJBM3FQSFTFOUBUJPO w 'SFF 0QFSBUJPOBM .POBEBOETNBSUDPOT
VTJOH("%5T w %J⒎FSFOUJBMPQFSBUPSTDBOBDDFQUBOZUFSNXIJDIDBOCF DBTUFEUPUIFJSJOUFOEFEBSHVNFOUT data Expr m a where Join Expr m (Expr m a) Expr m a Grad (ToPhysQty m qty) Expr m qty Expr m (PhysQty m) grad' (ToPhysQty m a) a Expr m (PhysQty m) grad' = Grad . toExpr -- pre-process for conversion
5BHMFTTpOBM4VNNBSZ w 4FQBSBUFTBSFBPGUBTLTCZNPOBEJDPQFSBUJPOT
FOBCMJOHUPDPODFOUSBUFPOUIFJSPXOCVTJOFTT w &RVBUJPOXSJUFSTEPOUIBWFUPDBSFBCPVUJNQM EFUBJM w 8FFYQMPJUTJNJMBSUFDITUPEFMJNJUNBOZPUIFS UBTLTFRVBUJPO
PQFSBUJPOJNQM
DBDIJOH
JOUFS QSPDFTTDPNNVOJDBUJPO
5BHMFTTpOBM4VNNBSZ w 4FQBSBUFTBSFBPGUBTLTCZNPOBEJDPQFSBUJPOT
FOBCMJOHUPDPODFOUSBUFPOUIFJSPXOCVTJOFTT w &RVBUJPOXSJUFSTEPOUIBWFUPDBSFBCPVUJNQM EFUBJM w 8FFYQMPJUTJNJMBSUFDITUPEFMJNJUNBOZPUIFS UBTLTFRVBUJPO
PQFSBUJPOJNQM
DBDIJOH
JOUFS QSPDFTTDPNNVOJDBUJPO w 8FDBOVTFJOJUJBMSFQSFTFOUBUJPOUPFMJNJOBUF CJOEIFMMJOUBHMFTTpOBMTUZMF
0VS(PBMTBOE)BTLFMM w (FOFSBM1VSQPTF4PMWFS w %FQFOEFOU)BTLFMM w 5BHMFTT'JOBMBOE*OJUJBM3FQSFTFOUBUJPO w 4QFFEBOE4DBMF w 1SJNJUJWF.POBET
3FXSJUJOH3VMFT
4QFDJBMJTBUJPO
*OUFSQSPDFTT DPNNVOJDBUJPO w .POBEJD4FRVFODF"CTUSBDUJPOUPNBLFVTFPGUIFTF w 1MVHJOTVTJOH&YUFOTJCMF3FDPSET w "OENBOZPUIFSUFDIOJRVFTOPUNFOUJPOFEUIJTUBML .PEVMBSJUZ
0VS(PBMTBOE)BTLFMM w (FOFSBM1VSQPTF4PMWFS w %FQFOEFOU)BTLFMM w 5BHMFTT'JOBMBOE*OJUJBM3FQSFTFOUBUJPO w 4QFFEBOE4DBMF w 1SJNJUJWF.POBET
3FXSJUJOH3VMFT
4QFDJBMJTBUJPO
*OUFSQSPDFTT DPNNVOJDBUJPO w .POBEJD4FRVFODF"CTUSBDUJPOUPNBLFVTFPGUIFTF w 1MVHJOTVTJOH&YUFOTJCMF3FDPSET w "OENBOZPUIFSUFDIOJRVFTOPUNFOUJPOFEUIJTUBML
4FRVFOUJBMUZQFTJO)BTLFMM w 1IZTJDBMWBMVFTBSFFYQSFTTFEBTTFRVFODFTPGSFBMT w 8IJDI4FRVFODFUZQFNVTUXFVTF w -JTUTHJWFOJO1SFMVEF
TJNQMFBOEEFDMBSBUJWF*'CVU4-08 JOEFYJOH
BENJUT'VTJPO w 7FDUPST'BTU 0
4USFBN'VTJPO<
> w 'VODUJPOTPOTFRVFODFTBUJTpFTTPNFBMHFCSBJDMBXT
XIJDIGVTFT NVMUJQMFMPPQJOUPPOFQBTT w VectorsFYQMPJUTVDISFMBUJPOTUPPQUJNJTFGVODUJPOT f z ∘ g ≡ (f ∘ g) z
4USFBN'VTJPO<
> w 'VODUJPOTPOTFRVFODFTBUJTpFTTPNFBMHFCSBJDMBXT
XIJDIGVTFT NVMUJQMFMPPQJOUPPOFQBTT w VectorsFYQMPJUTVDISFMBUJPOTUPPQUJNJTFGVODUJPOT w 5IFZPODFDPOWFSUWFDUPSTUPBCTUSBDUStreamTBOEBundleT f z ∘ g ≡ (f ∘ g) z
4USFBN'VTJPO<
> w 'VODUJPOTPOTFRVFODFTBUJTpFTTPNFBMHFCSBJDMBXT
XIJDIGVTFT NVMUJQMFMPPQJOUPPOFQBTT w VectorsFYQMPJUTVDISFMBUJPOTUPPQUJNJTFGVODUJPOT w 5IFZPODFDPOWFSUWFDUPSTUPBCTUSBDUStreamTBOEBundleT w 4USFBNBNPOBEJDHFOFSBUJOHGVODUJPO f z ∘ g ≡ (f ∘ g) z
4USFBN'VTJPO<
> w 'VODUJPOTPOTFRVFODFTBUJTpFTTPNFBMHFCSBJDMBXT
XIJDIGVTFT NVMUJQMFMPPQJOUPPOFQBTT w VectorsFYQMPJUTVDISFMBUJPOTUPPQUJNJTFGVODUJPOT w 5IFZPODFDPOWFSUWFDUPSTUPBCTUSBDUStreamTBOEBundleT w 4USFBNBNPOBEJDHFOFSBUJOHGVODUJPO w #VOEMF4USFBNPQUJPOBMDPODSFUFWFDUPSWBMVFBOEMFOHUI JOGPSNBUJPO f z ∘ g ≡ (f ∘ g) z
4USFBN'VTJPO<
> w 'VODUJPOTPOTFRVFODFTBUJTpFTTPNFBMHFCSBJDMBXT
XIJDIGVTFT NVMUJQMFMPPQJOUPPOFQBTT w VectorsFYQMPJUTVDISFMBUJPOTUPPQUJNJTFGVODUJPOT w 5IFZPODFDPOWFSUWFDUPSTUPBCTUSBDUStreamTBOEBundleT w 4USFBNBNPOBEJDHFOFSBUJOHGVODUJPO w #VOEMF4USFBNPQUJPOBMDPODSFUFWFDUPSWBMVFBOEMFOHUI JOGPSNBUJPO w TUSFBNVOTUSFBNGVODUJPOTDPOWFSUT7FDUPSTUPGSPN#VOEMFT f z ∘ g ≡ (f ∘ g) z
1SPCMFN.BOZLJOETPG WFDUPS w #PYFEDBOTUPSFBOZUZQFT w 6OCPYFEDBOTUPSF TVNPGQSPEVDUTPG VOCPYFE UZQFTFH*OU
%PVCMF
#PPM w 4UPSBCMFGPSDPNNVOJDBUJPOTXJUI$MJCSBSZ w BOENPOPNPSQIJDOFXUZQFXSBQQFSTBSPVOEUIFN w 1SPCMFN8FXBOUUPUSFBUUIFNVOJGPSNMZ w $BOXFEPUIJTSFUBJOJOHF⒏DJFODZPGWFDUPST
'JSTU"UUFNQU type family Elem seq type family Key seq class Monad m MSeq m seq where imap (Key seq Elem seq Elem seq) seq m seq index Index seq seq m (Elem seq) ifoldr (Key seq Elem seq Elem seq) accum instance Monad m MSeq m (Vector a) instance Monad m MSeq m (VecMap k a) .POBEJDSFTVMU w 1SPCMFN.POBEJDSFTVMUNJHIUTBDSJpDFTUSFBNGVTJPO w 1SPCMFN)BWFUPJNQMFNFOUWFDUPSPQFSBUJPOTBMMCZIBOET .BOZPUIFSPQT
"OTXFSTUSFBNVOTUSFBN w "MNPTUBMMWFDUPSPQFSBUJPOTBSFJOEFFEJNQMEBT DPNQPTJUJPOTPGTUSFBNVOTUSFBNXJUI4USFBN #VOEMFPQFSBUJPOT w 4JODF4USFBN#VOEMFTBSFNPOBEJDCZEFGBVMUBOE UIFZGVTFTXFMM
XFDBOHFUF⒏DJFODZGPSGSFF
"OTXFSTUSFBNVOTUSFBN w "MNPTUBMMWFDUPSPQFSBUJPOTBSFJOEFFEJNQMEBT DPNQPTJUJPOTPGTUSFBNVOTUSFBNXJUI4USFBN #VOEMFPQFSBUJPOT w 4JODF4USFBN#VOEMFTBSFNPOBEJDCZEFGBVMUBOE UIFZGVTFTXFMM
XFDBOHFUF⒏DJFODZGPSGSFF w 5IFSVMFstream ○ unstream ≡ returnSFEVDFT JOUFSOBMUFSNTFWFOJGUIFSFTVMUJTNPOBEJD w 0OFDBOBMTPQSPWJEFBO*'UPGVTFEJ⒎FSFOULJOEPG WFDUPSTJOUPPOF
3FTVMU type family VecRep seq Type Type class (Monad m) MSequence m seq where unfoldrM (s m (Maybe (Elem seq, s))) s m seq indexM' seq Int m (Elem seq) stream' seq B.Bundle m (VecRep seq) (Elem seq) unstream' B.Bundle m (VecRep seq) (Elem seq) m seq
3FTVMU type family VecRep seq Type Type class (Monad m) MSequence m seq where unfoldrM (s m (Maybe (Elem seq, s))) s m seq indexM' seq Int m (Elem seq) stream' seq B.Bundle m (VecRep seq) (Elem seq) unstream' B.Bundle m (VecRep seq) (Elem seq) m seq w "MMPUIFSPQFSBUJPOTBSFEFSJWFEGSPNUIFTFQSJNJUJWFTXJUI Data.Vector.Fusion.Bundle.MonadicNPEVMF
3FTVMU type family VecRep seq Type Type class (Monad m) MSequence m seq where unfoldrM (s m (Maybe (Elem seq, s))) s m seq indexM' seq Int m (Elem seq) stream' seq B.Bundle m (VecRep seq) (Elem seq) unstream' B.Bundle m (VecRep seq) (Elem seq) m seq w "MMPUIFSPQFSBUJPOTBSFEFSJWFEGSPNUIFTFQSJNJUJWFTXJUI Data.Vector.Fusion.Bundle.MonadicNPEVMF w 0OFDBOFYQMPJUGVTJPOSVMFTQSPWJEFECZWFDUPSQBDLBHFGPSGSFF
3FTVMU type family VecRep seq Type Type class (Monad m) MSequence m seq where unfoldrM (s m (Maybe (Elem seq, s))) s m seq indexM' seq Int m (Elem seq) stream' seq B.Bundle m (VecRep seq) (Elem seq) unstream' B.Bundle m (VecRep seq) (Elem seq) m seq w "MMPUIFSPQFSBUJPOTBSFEFSJWFEGSPNUIFTFQSJNJUJWFTXJUI Data.Vector.Fusion.Bundle.MonadicNPEVMF w 0OFDBOFYQMPJUGVTJPOSVMFTQSPWJEFECZWFDUPSQBDLBHFGPSGSFF w #POVT)FUFSPHFOFPVT$PNCJOBUPSTBOE1SJN.POBEPQUJNJTBUJPO
#POVT)FUFSPHFOFPVT $PNCJOBUPST w 0OFDBONBQ[JQEJ⒎FSFOULJOEPGTUSFBNTJOPOFQBTT w 8FQSPWJEF3FXSJUF3VMFTUPFMJNJOBUFDPOWFSTJPOPWFSIFBET XIFOTPNFPGBSHVNFOUTIBWFUIFTBNFWFDUPSSFQSFTFOUBUJPO hzipWith (MSeq m s, MSeq m t, MSeq m u, Key s ~ Key t, Key s ~ Key u) (Elem s Elem t Elem u) s t m u hzipWithM f = \as bs unstream $ B.zipWithM f (B.reVector $ stream as) (B.reVector $ stream bs)
#POVT%FTUSVDUJWF "TTJHONFOUTBSF:PVS'SJFOET w MSeqBTTVNFTUIFJSSFUVSOUZQFUPCFNPOBEJD w 5IFSFJTBDMBTTPG.POBETBENJUUJOHEFTUSVDUJWF BTTJHONFOUT
PrimMonad GSPNprimitiveQBDLBHF
#POVT%FTUSVDUJWF "TTJHONFOUTBSF:PVS'SJFOET w MSeqBTTVNFTUIFJSSFUVSOUZQFUPCFNPOBEJD w 5IFSFJTBDMBTTPG.POBETBENJUUJOHEFTUSVDUJWF BTTJHONFOUT
PrimMonad GSPNprimitiveQBDLBHF
w 1SPWJEFTBDPNNPO*'GPSSTBOEIONPOBETBOE NPOBEUSBOTGPSNFSTBSPVOEUIFN
#POVT%FTUSVDUJWF "TTJHONFOUTBSF:PVS'SJFOET w MSeqBTTVNFTUIFJSSFUVSOUZQFUPCFNPOBEJD w 5IFSFJTBDMBTTPG.POBETBENJUUJOHEFTUSVDUJWF BTTJHONFOUT
PrimMonad GSPNprimitiveQBDLBHF
w 1SPWJEFTBDPNNPO*'GPSSTBOEIONPOBETBOE NPOBEUSBOTGPSNFSTBSPVOEUIFN w *GVOEFSMZJOHNPOBEmJTPrimMonad
POFDBOVTFUIFJS BCJMJUZGPSNVUBCMFSFGFSFODFTUPHBJOQFSGPSNBODF
.POBEJD4FRVFODFBOE 1SJN.POBE4VNNBSZ w 4USFBN'VTJPOSFEVDFTDPOTUBOUPWFSIFBETJHOJpDBOUMZ w &YQMPJUJOHvectorT4USFBN#VOEMF'VTJPONFDIBOJTN XPSLTMJLFBDIBSN w "MTPFOBCMFTUPGVTFEJ⒎FSFOULJOEPGWFDUPST w 3FXSJUJOH3VMFTDBOIFMQSFEVDFPWFSIFBEIFSF
.POBEJD4FRVFODFBOE 1SJN.POBE4VNNBSZ w 4USFBN'VTJPOSFEVDFTDPOTUBOUPWFSIFBETJHOJpDBOUMZ w &YQMPJUJOHvectorT4USFBN#VOEMF'VTJPONFDIBOJTN XPSLTMJLFBDIBSN w "MTPFOBCMFTUPGVTFEJ⒎FSFOULJOEPGWFDUPST w 3FXSJUJOH3VMFTDBOIFMQSFEVDFPWFSIFBEIFSF w *GUIFSFTVMUUZQFJTNPOBEJD
UIFOPOFDBOFYQMPJU1SJN.POBE JOTUBODFUPHBJONPSFTQFFE
SFUBJOJOHEFDMBSBUJWFNBOOFS w 5IJTDPNQPTFTXFMMXJUIUBHMFTTpOBMTUZMFBQQSPBDI
JNQMFNFOUFEXJUI3*0QBUUFSO w %FTUSVDUJWFBTTJHONFOUT EJTHVJTFEBTEFDMBSBUJWF DPNCJOBUPST BSFJOEFFEZPVSGSJFOET
0VS(PBMTBOE)BTLFMM w (FOFSBM1VSQPTF4PMWFS w %FQFOEFOU)BTLFMM w 5BHMFTT'JOBMBOE*OJUJBM3FQSFTFOUBUJPO w 4QFFEBOE4DBMF w 1SJNJUJWF.POBET
3FXSJUJOH3VMFT
4QFDJBMJTBUJPO
*OUFSQSPDFTT DPNNVOJDBUJPO w .POBEJD4FRVFODF"CTUSBDUJPOUPNBLFVTFPGUIFTF w 1MVHJOTVTJOH&YUFOTJCMF3FDPSET w "OENBOZPUIFSUFDIOJRVFTOPUNFOUJPOFEUIJTUBML
0VS(PBMTBOE)BTLFMM w (FOFSBM1VSQPTF4PMWFS w %FQFOEFOU)BTLFMM w 5BHMFTT'JOBMBOE*OJUJBM3FQSFTFOUBUJPO w 4QFFEBOE4DBMF w 1SJNJUJWF.POBET
3FXSJUJOH3VMFT
4QFDJBMJTBUJPO
*OUFSQSPDFTT DPNNVOJDBUJPO w .POBEJD4FRVFODF"CTUSBDUJPOUPNBLFVTFPGUIFTF w 1MVHJOTVTJOH&YUFOTJCMF3FDPSET w "OENBOZPUIFSUFDIOJRVFTOPUNFOUJPOFEUIJTUBML &YUFOTJCJMJUZ
.PUJWBUJPO1MVHJO .FDIBOJTN w 5BHMFTTpOBMTUZMFBMMPXFEVTUPXSJUFNVMUJQMF 4PMWFSTOJDFMZ w CVUUIFPGTPMWFSTFWFOUVBMMZJODSFBTFE
BOE JUIBECFDPNFIBSEUPNBJOUBJOBMMPGUIFN
.PUJWBUJPO1MVHJO .FDIBOJTN w 5BHMFTTpOBMTUZMFBMMPXFEVTUPXSJUFNVMUJQMF 4PMWFSTOJDFMZ w CVUUIFPGTPMWFSTFWFOUVBMMZJODSFBTFE
BOE JUIBECFDPNFIBSEUPNBJOUBJOBMMPGUIFN w *UJTEFTJSBCMFGPSVTUPIBWFPOMZBMJNJUFEOVNCFS PG4PMWFSTBOEFYUFOEUIFNCZ1MVHJOTGPS NPEVMBSJUZBOENBJOUBJOBCJMJUZ
.PUJWBUJPO1MVHJO .FDIBOJTN w 5BHMFTTpOBMTUZMFBMMPXFEVTUPXSJUFNVMUJQMF 4PMWFSTOJDFMZ w CVUUIFPGTPMWFSTFWFOUVBMMZJODSFBTFE
BOE JUIBECFDPNFIBSEUPNBJOUBJOBMMPGUIFN w *UJTEFTJSBCMFGPSVTUPIBWFPOMZBMJNJUFEOVNCFS PG4PMWFSTBOEFYUFOEUIFNCZ1MVHJOTGPS NPEVMBSJUZBOENBJOUBJOBCJMJUZ w 8IBUTOFFEFEGPSUIFN
1MVHJO4QFD class Plugin p where data PState p Type data PConfig p Type type POutput p Type type PlugM p (m * *) Constraint pluginOptionP OptParser (PConfig p) setupState MonadIO m PConfig p m (PState p) initialise (p ∈ ps, MonadPlugins ps m, PlugM p m) proxy p Info m Info finalise (p ∈ ps, MonadPlugins ps m, PlugM p m) proxy p Info m Info genOutput (p ∈ ps, MonadPlugins ps m, PlugM p m) PConfig p m (POutput p)
#VOEMJOHNVMUJQMFQMVHJO EBUBUPPOF w 8FSFQSFTFOUUIF4PMWFSNPOBETXJUIQMVHJOTQTBTB4PMWFS QT
XIFSFQTJTBUZQFMFWFMMJTUPGQMVHJOT data PStateBundle ps = PSB { p PState p | p ∈ ps } w 0OFDBOTJNVMBUFTVDIEBUBUZQFTXJUI )JHIFS,JOEFE
&YUFOTJCMF3FDPSET JOUIJTDBTF
),)-JTUTV⒏DFT
UIPVHI
w "OFOUJSF4PMWFSXJUIQMVHJOTpsNVTULFFQJOGP BTTPDJBUFEUPFBDIQMVHJOBTBCVOEMF
TPNFUIJOHMJLF Solver '[] -- Solver without any Plugin Solver '[A, B, C] -- Solver with Plugins A, B and C
&YUFOTJCMF3FDPSET w )BTLFMMT3FDPSE-BCFMTBOE7BMVFTBSFpYFE w &YUFOTJCMF3FDPSETPOFDBOEZOBNJDBMMZBEEEFMFUF
DPOTUSBJOpFMETBOEUSFBUQPMZNPSQIJDBMMZ
SFUBJOJOHUZQFTBGFUZ w 'PSFBDIp ∈ ps
PState p WBMVFJOstates PStateB psDBOCF SFUSJFWFECZstates ^. hfieldL @p w 5IFSFBSFQMFOUZPGFYJTUJOHMJCT extensible, vinyl, superrecords,FUD
GPSFYUSFDTCVUXFJNQMECZPVSTFMWFTGPSTPNFSFBTPOT w ),%PQT
TVDIBTCGPMES.CGPMEM. .FNCFSDPOTUS DBOCFVTFEUP QSPDFTTCVOEMFTCBDLXBSEGPSXBSE type PBundle h ps = Record h (IdentFields ps) type PStateB ps = PBundle PState ps
8IZDVTUPNMJCSBSZ w *UNVTUTBUJTGZUIFGPMMPXJOHTBUUIFTBNFUJNF w 'BTU"DDFTT*OUFSOBMSFQSNVTUCFBSSBZWFDUPS
OPUMJOLFE MJTU w -JHIU1BDLBHF%FQFOEFODZXFOFFEPOMZXIBUXFOFFE
8IZDVTUPNMJCSBSZ w *UNVTUTBUJTGZUIFGPMMPXJOHTBUUIFTBNFUJNF w 'BTU"DDFTT*OUFSOBMSFQSNVTUCFBSSBZWFDUPS
OPUMJOLFE MJTU w -JHIU1BDLBHF%FQFOEFODZXFOFFEPOMZXIBUXFOFFE w 1PMZNPSQIJD-BCFMXFXBOUUPMBCFMpFMETXJUIBSCJUSBSZ UZQFT
OPUOFDFTTBSJMZDPOWFSUJCMFUP4ZNCPMTPS/BUT
8IZDVTUPNMJCSBSZ w *UNVTUTBUJTGZUIFGPMMPXJOHTBUUIFTBNFUJNF w 'BTU"DDFTT*OUFSOBMSFQSNVTUCFBSSBZWFDUPS
OPUMJOLFE MJTU w -JHIU1BDLBHF%FQFOEFODZXFOFFEPOMZXIBUXFOFFE w 1PMZNPSQIJD-BCFMXFXBOUUPMBCFMpFMETXJUIBSCJUSBSZ UZQFT
OPUOFDFTTBSJMZDPOWFSUJCMFUP4ZNCPMTPS/BUT w ),%MJLFPQFSBUJPOTOFFEFEGPSWBSJPVTGPMEJOHNBQQJOH PQFSBUJPOTFHTFSJBMJTBUJPO
JOJUJBMJTBUJPO
8IZDVTUPNMJCSBSZ w *UNVTUTBUJTGZUIFGPMMPXJOHTBUUIFTBNFUJNF w 'BTU"DDFTT*OUFSOBMSFQSNVTUCFBSSBZWFDUPS
OPUMJOLFE MJTU w -JHIU1BDLBHF%FQFOEFODZXFOFFEPOMZXIBUXFOFFE w 1PMZNPSQIJD-BCFMXFXBOUUPMBCFMpFMETXJUIBSCJUSBSZ UZQFT
OPUOFDFTTBSJMZDPOWFSUJCMFUP4ZNCPMTPS/BUT w ),%MJLFPQFSBUJPOTOFFEFEGPSWBSJPVTGPMEJOHNBQQJOH PQFSBUJPOTFHTFSJBMJTBUJPO
JOJUJBMJTBUJPO w 0VSMJCBMTPQSPWJEFT()$1MVHJOT
BMMPXJOHUPXSJUF3FDPSE DPOTUSVDUJPOOBUVSBMMZBOESFEVDFTUIFBNPVOUPGIBOE XSJUUFOQSPPGT
#FGPSF5D1MVHJO (&%~) forall l xs h a. Member l (Labels xs) Record h xs l := (h (ElemAt (Idx l (Labels xs)) (Vals xs)) h a) Record h ((l a) |< xs) Record hl &%~ (_ := f) = Record $ gcastWith (takeMapApply @Entry' @(Index l (Labels xs)) @xs) $ gcastWith (dropMapApply @Entry' @(Index l (Labels xs) + 1) @xs) $ gcastWith (mapApplyAppend @Entry' @(Take (Index l (Labels xs)) xs) @((l a) ': Drop (Index l (Labels xs) + 1) xs) ) $ hmodify' (Proxy @(Index l (Labels xs))) f hl 5SJWJBMIBOEXSJUUFOQSPPGT .BQI YTZT .BQIYT.BQIZT
#FGPSF5D1MVHJO (&%~) forall l xs h a. Member l (Labels xs) Record h xs l := (h (ElemAt (Idx l (Labels xs)) (Vals xs)) h a) Record h ((l a) |< xs) Record hl &%~ (_ := f) = Record $ gcastWith (takeMapApply @Entry' @(Index l (Labels xs)) @xs) $ gcastWith (dropMapApply @Entry' @(Index l (Labels xs) + 1) @xs) $ gcastWith (mapApplyAppend @Entry' @(Take (Index l (Labels xs)) xs) @((l a) ': Drop (Index l (Labels xs) + 1) xs) ) $ hmodify' (Proxy @(Index l (Labels xs))) f hl 5SJWJBMIBOEXSJUUFOQSPPGT .BQI YTZT .BQIYT.BQIZT
"GUFS5D1MVHJO {-# OPTIONS_GHC -fplugin Data.TypeLevel.List.Solver #-} (&%~) forall l xs h a. Member l (Labels xs) Record h xs l := (h (ElemAt (Idx l (Labels xs)) (Vals xs)) h a) Record h ((l a) |< xs) Record hl &%~ (_ := f) = Record $ hmodify' (Proxy @(Index l (Labels xs))) f hl
1MVHJOT4VNNBSZ w &YUFOTJCMF3FDPSETBSFQBSUJDVMBSMZVTFGVMGPS1MVHJOT w ),%PQFSBUJPOT
TVDIBTIFUFSPGPMETBOENBQT
DBOCFVTFEUP JNQMJOJUJBMJTBUJPOTFSJBMJTBUJPO w /PUPOMZ),%T
CVUTJNQMFWBMVFMFWFMGPMEJOHPGUZQFMFWFMMJTUT JTBMTPVTFGVM
1MVHJOT4VNNBSZ w &YUFOTJCMF3FDPSETBSFQBSUJDVMBSMZVTFGVMGPS1MVHJOT w ),%PQFSBUJPOT
TVDIBTIFUFSPGPMETBOENBQT
DBOCFVTFEUP JNQMJOJUJBMJTBUJPOTFSJBMJTBUJPO w /PUPOMZ),%T
CVUTJNQMFWBMVFMFWFMGPMEJOHPGUZQFMFWFMMJTUT JTBMTPVTFGVM w "LJOEPGSPXQPMZNPSQIJTNDBOBMTPCFVTFEUPUSFBUBCVOEMFPG QIZTJDBMRVBOUJUJFTQPMZNPSQIJDBMMZ
1MVHJOT4VNNBSZ w &YUFOTJCMF3FDPSETBSFQBSUJDVMBSMZVTFGVMGPS1MVHJOT w ),%PQFSBUJPOT
TVDIBTIFUFSPGPMETBOENBQT
DBOCFVTFEUP JNQMJOJUJBMJTBUJPOTFSJBMJTBUJPO w /PUPOMZ),%T
CVUTJNQMFWBMVFMFWFMGPMEJOHPGUZQFMFWFMMJTUT JTBMTPVTFGVM w "LJOEPGSPXQPMZNPSQIJTNDBOBMTPCFVTFEUPUSFBUBCVOEMFPG QIZTJDBMRVBOUJUJFTQPMZNPSQIJDBMMZ w 8FEFWJTFEDVTUPN&YU3FDMJCSBSZXJUI
1MVHJOT4VNNBSZ w &YUFOTJCMF3FDPSETBSFQBSUJDVMBSMZVTFGVMGPS1MVHJOT w ),%PQFSBUJPOT
TVDIBTIFUFSPGPMETBOENBQT
DBOCFVTFEUP JNQMJOJUJBMJTBUJPOTFSJBMJTBUJPO w /PUPOMZ),%T
CVUTJNQMFWBMVFMFWFMGPMEJOHPGUZQFMFWFMMJTUT JTBMTPVTFGVM w "LJOEPGSPXQPMZNPSQIJTNDBOBMTPCFVTFEUPUSFBUBCVOEMFPG QIZTJDBMRVBOUJUJFTQPMZNPSQIJDBMMZ w 8FEFWJTFEDVTUPN&YU3FDMJCSBSZXJUI w 1PMZNPSQIJDMBCFMT
GBTUJOEFYJOH
BVUPNBUJDDPOTUSBJOUTPMWJOH BTTJTUFECZ5ZQFDIFDLFSQMVHJOT
$PODMVTJPOT w )BTLFMMDBOCFVTFEBDIJFWFTJNVMUBOFPVTMZ w )JHIQFSGPNBODFBOE
w "CTUSBDU
IJHIMZFYUFOTJCMF
HFOFSBMQVSQPTFTPGUXBSF w ()$T%FQFOEFOU5ZQFTIFMQTFYUFOTJCJMJUZBOELFFQJOHJOWBSJBOUT w )VNBOT'PSHFU-FU5ZQFT3FNFNCFS w %FQFOEFOU5ZQFTBOE%FTUSVDUJWF"TTJHONFOUTBSFZPVSGSJFET w 8FBSFQMBOOJOHUPQVCMJTIJOUFSOBMMJCSBSJFT JOOPUTPGBSGVUVSF
IPQFGVMMZ
#JCMJPHSBQIZ Oleg Kiselyov, Tagless-final style. http:// okmij.org/ftp/tagless-final/index.html 2. D. Coutts, R. Leshchinskiy and D. Stewart, Stream Fusion: From Lists to Streams to Nothing at All. 3. G. Mainland, R. Leshchinskiy and SPJ, Exploiting Vector Instructions with Generalized Stream Fusion. 4. ghc-typelits-natnormalise package
"OZ2VFTUJPOT w )BTLFMMDBOCFVTFEBDIJFWFTJNVMUBOFPVTMZ w )JHIQFSGPNBODFBOE
w "CTUSBDU
IJHIMZFYUFOTJCMF
HFOFSBMQVSQPTFTPGUXBSF w ()$T%FQFOEFOU5ZQFTIFMQTFYUFOTJCJMJUZBOELFFQJOHJOWBSJBOUT w )VNBOT'PSHFU-FU5ZQFT3FNFNCFS w %FQFOEFOU5ZQFTBOE%FTUSVDUJWF"TTJHONFOUTBSFZPVSGSJFET w 8FBSFQMBOOJOHUPQVCMJTIJOUFSOBMMJCSBSJFT JOOPUTPGBSGVUVSF
IPQFGVMMZ