我知道这是代码有点傻,但有人可以解释为什么这会isList [42]返回True而isList2 [42]打印False,以及如何防止这种情况?我想更好地理解一些更模糊的GHC类型扩展,我认为这将是一个有趣的例子来弄清楚.
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE OverlappingInstances #-}
{-# LANGUAGE IncoherentInstances #-}
class IsList a where
isList :: a -> Bool
instance IsList a where
isList x = False
instance IsList [a] where
isList x = True
isList2 = isList
main =
print (isList 42) >>
print (isList2 42) >>
print (isList [42]) >>
print (isList2 [42])
Run Code Online (Sandbox Code Playgroud) 请考虑以下示例程序:
next :: Int -> Int
next i
| 0 == m2 = d2
| otherwise = 3 * i + 1
where
(d2, m2) = i `divMod` 2
loopIteration :: MaybeT (StateT Int IO) ()
loopIteration = do
i <- get
guard $ i > 1
liftIO $ print i
modify next
main :: IO ()
main = do
(`runStateT` 31) . runMaybeT . forever $ loopIteration
return ()
Run Code Online (Sandbox Code Playgroud)
它只能使用get而不是lift get因为instance MonadState s m …