相关疑难解决方法(0)

Haskell重叠/非相干实例

我知道这是代码有点傻,但有人可以解释为什么这会isList [42]返回TrueisList2 [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)

haskell types

12
推荐指数
1
解决办法
1287
查看次数

Haskell:重叠实例

请考虑以下示例程序:

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 …

haskell typeclass

9
推荐指数
2
解决办法
4842
查看次数

标签 统计

haskell ×2

typeclass ×1

types ×1