
On 11/06/2012 02:44 AM, Ertugrul Söylemez wrote:
Nathan Hüsken
wrote: Also your interface seems very unsafe to me. I suggest the following interface instead:
shrinking :: (Monad m) => [Wire e m a b] -> Wire e m a [b]
Then normally 'a' could be something like Map K A.
That would mean, the individual wires have to know there own id?!? Mmmh, I will try to keep this bookkeeping out of the wires with this interface:
shrinking :: (Monad m) => [Wire e m a b] -> Wire e m (Map Int a) (Int,b)
shrinking will assign the ids to the wires and returns them with the result. I will see where this gets me ... :).
The problem with such an interface is the inflexibility. Notice that removing a subwire will change the numbering of all subsequent wires. The interface I suggested follows this basic idea:
shrinking :: (Monad m) => [(a' -> a, Wire e m a b)] -> Wire e m a' b
That should be ".. -> Wire e m a' [b]", correct?
The reasoning is that this way you disconnect the individual values from the positions in the subwire list. This will also make writing the combinator a bit simpler. If you will here is an interesting alternative:
data Subwire e m a b = forall a'. Subwire (a -> a') (Wire e m a' b)
shrinking :: (Monad m) => [Subwire e m a b] -> Wire e m a b
Ohh, the scary forall keyword :). Here it does nothing but hide the a' type from the type signature, is that correct? Thanks! Nathan