packages feed

quipper-demos-0.9.0.0: dist/build/BoxExample/BoxExample-tmp/Quipper/Demos/BoxExample.hs

{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE TypeFamilies #-}
{-# LINE 1 "Quipper/Demos/BoxExample.hs" #-}
import Quipper

-- Unboxed version of subroutine
my_sub :: (Qubit, Qubit, Qubit) -> Circ (Qubit, Qubit, Qubit)
my_sub (a,b,c) = do
  hadamard_at a `controlled` b
  hadamard_at a `controlled` c
  hadamard_at b `controlled` c
  return (a,b,c)
  
-- Boxed version of subroutine
boxed_sub :: (Qubit, Qubit, Qubit) -> Circ (Qubit, Qubit, Qubit)
boxed_sub = box "my_sub" my_sub

-- Unboxed version of circuit
my_circuit :: [Qubit] -> Circ [Qubit]
my_circuit [] = return []
my_circuit [a] = return [a]
my_circuit [a,b] = return [a,b]
my_circuit (a:b:c:rest) = do
  (a,b,c) <- my_sub (a,b,c)
  x <- my_circuit (b:c:rest)
  return (a:x)

-- Boxed version of circuit
my_circuit_boxed :: [Qubit] -> Circ [Qubit]
my_circuit_boxed [] = return []
my_circuit_boxed [a] = return [a]
my_circuit_boxed [a,b] = return [a,b]
my_circuit_boxed (a:b:c:rest) = do
  (a,b,c) <- boxed_sub (a,b,c)
  x <- my_circuit_boxed (b:c:rest)
  return (a:x)

main = do
  print_generic Preview my_circuit_boxed (replicate 6 qubit)