<div dir="ltr"><div>First, we can clean that code:</div><div><br></div><div>do xs <- mapM (readFile . fpFromString) (files opts)</div><div>   hPut stdout (process opts (concat xs))</div><div><br></div><div>You won't be able to make the decision of which type process should work</div><div>at inside of process because this decision will also affect which</div><div>implementation of readFile is used.</div><div><br></div><div>What you will need to do is inspect the 'opts' in the function above</div><div>and execute it at a type as determined by the options.</div><div><br></div><div>example opts</div><div>  | isTextMode opts       = aboveFunctionAsText opts</div><div>  | isByteStringMode opts = aboveFunctionAsByteString opts</div><div><br></div><div><br></div><div>If you'd like to unify these into a single implementation as above</div><div>you'll need to provide some kind of extra information to resolve</div><div>the type ambiguity. This would have a type like:</div><div><br></div><div>aboveFunctionWithProxy :: IsSequence a => proxy a -> Options -> IO ()</div><div><br></div><div>exampleUsingProxies opts</div><div>  | isTextMode opts       = aboveFunctionWithProxy (Proxy :: Proxy Text) opts</div><div><div>  | isByteStringMode opts = aboveFunctionWithProxy (Proxy :: Proxy ByteString) opts</div></div><div><br></div><div>The proxy parameter could then need to be linked to the type of the</div><div>internal xs parameter above using either scoped type variables or</div><div>a helper function similar to 'asTypeOf' with with a different type!</div></div><div class="gmail_extra"><br><div class="gmail_quote">On Fri, May 8, 2015 at 1:10 PM, Mike Meyer <span dir="ltr"><<a href="mailto:mwm@mired.org" target="_blank">mwm@mired.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">Ok, I can't seem to figure out how to make this work, and since I'm using ClassyPrelude (from classy-prelude, latest version on hackage as of yesterday), I think cafe is a better place to ask than beginners. Sorry if this should have gone there.<div><br></div><div>I want to read in a list of files, concatenate them, and then run the resulting data through a "process" function. So far, no problem. Given an opts record that contains the list of files and some control for the process function, this expression works:</div><div><br></div><div>hPut stdout =<< process opts . concat</div><div><$> mapM (readFile . fpFromString) (files opts)</div><div><br></div><div>(BTW, recommendations on cleaning that up gratefully accepted)</div><div><br></div><div>However, I'd like to be able to read them all as either Text or ByteString, depending on options being passed to me. This doesn't work so well. If I give process a type of Text -> Text or ByteString->ByteString, everything works fine with no other changes. However, any attempt to make it polymorphic fails with ambiguous type warnings.</div><div><br></div><div>I've tried a slew of things, and found a few that work. But none of them are what I'd call good, much less elegant. Is there a good way to do this?</div></div>
<br>_______________________________________________<br>
Haskell-Cafe mailing list<br>
<a href="mailto:Haskell-Cafe@haskell.org">Haskell-Cafe@haskell.org</a><br>
<a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe" target="_blank">http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe</a><br>
<br></blockquote></div><br><br clear="all"><div><br></div>-- <br><div class="gmail_signature">Eric Mertens</div>
</div>