4 ms·
Hmm, seems like this could potentially be solved in a cool way using the amb operator. Might have to give that a shot later today.
by Crito 12y ago
Hmm, seems like this could potentially be solved in a cool way using the amb operator. Might have to give that a shot later today.
- japr59 12y agoDefinitely. For anybody interested, http://mitpress.mit.edu/sicp/full-text/sicp/book/node90.html http://mitpress.mit.edu/sicp/full-text/sicp/book/node90.html offers a nice introduction to the amb operator. One issue that I found when solving problems like this is that, to achieve speed, it can become necessary to use many nested lets. That could hurt readability. Nobody wants to see a line of code nested 20 tabs deep!
- tonetheman 12y agoOh node programmers love that... :)
- twfarland 12y agoHaskell lists also work nicely for nondeterministic computation.
- andolanra 12y agoIndeed, we can use Haskell lists as the amb operator and implement require as require :: Bool -> [()] require True = return () require False = [] and then express amb-like computations in effectively the same way: sample :: [(Int, Int)] sample = do x <- [1,2,3,4,5] y <- [1,2,3,4,5] require (x == 2 * y) return (x, y) after which the value of sample is [(2,1),(4,2)]. (Also, my require is effectively the same as the guard function found in Control.Monad, specialized for lists.)