我读Dynamic programming example,有这样的代码:警卫在哈斯克尔
buy n = r!n
where r = listArray (0,n) (Just (0,0,0) : map f [1..n])
f i = do (x,y,z) <- attempt (i-6)
return (x+1,y,z)
`mplus`
do (x,y,z) <- attempt (i-9)
return (x,y+1,z)
`mplus`
do (x,y,z) <- attempt (i-20)
return (x,y,z+1)
attempt x = guard (x>=0) >> r!x
我的问题是如何attempt x = guard (x>=0) >> r!x
作品?
根据该Control.Monad源代码,
guard True = pure()
guard False = empty
pure :: a -> f a
m >> k = m >>= \_ -> k
所以如果x> 0,则:
attempt x
= (guard True) >> (r!x) = (pure()) >> (r!x)
= (pure()) >>= \_ -> r!x = (f()) >>= (\_ -> r!x)
因此f()
应(在这种情况下Maybe a
)是m a
类型,但如何做Haskell知道什么f
是?因为它从未被指定,所以f()
可以返回empty
。 (f
f
指在纯)
如果x < 0,empty
不在Maybe
,如何能这仍然施加到>>=
?
'纯()::也许(==刚()'? – Mephy
@Mephy'Maybe()== Just()'如何应用于'>> ='? – CYC
在[this source](http://hackage.haskell.org/package/base-4.8)的第634行中没有应用程序,'pure():: Maybe()'被定义为'Just() .1.0 /文档/ SRC/GHC.Base.html)。 – Mephy