我试图模式匹配上Data.Typeable.TypeRep以下代码:问题与模式匹配和情况下表达过Data.Typeable.TypeRep
import Data.Typeable (TypeRep, typeOf)
tyI = typeOf (1 :: Int)
tyD = typeOf (3.14 :: Double)
tyB = typeOf (True :: Bool)
func1 :: TypeRep -> Bool
func1 tyI = False
func1 tyD = False
func1 _ = True
func2 :: TypeRep -> Bool
func2 tr = case tr of
tyI -> False
tyD -> False
_ -> True
func3 :: TypeRep -> Bool
func3 tr = if tr == tyI then False else
if tr == tyD then False else
True
...和我得到的编译这些警告:
[1 of 1] Compiling Main (/home/[..]/test.hs, interpreted)
/home/[..]/test.hs:8:1: Warning:
Pattern match(es) are overlapped
In an equation for ‘func1’:
func1 tyD = ...
func1 _ = ...
/home/[..]/test.hs:23:12: Warning:
Pattern match(es) are overlapped
In a case alternative:
tyD -> ...
_ -> ...
Ok, modules loaded: Main.
而且,我得到了令人惊讶的结果:
*Main> func1 tyI
False
*Main> func1 tyD
False
*Main> func1 tyB
False -- !!!
*Main> func2 tyI
False
*Main> func2 tyD
False
*Main> func2 tyB
False -- !!!
*Main> func3 tyI
False
*Main> func3 tyD
False
*Main> func3 tyB
True -- Ok!
所以只有最后一个功能FUNC3 SE ems产生预期的结果。我应该如何使用模式匹配(func1)和case(func2)函数在TypeReps上正常工作?
使用'-Wall'启用更多警告:在这种情况下,还应该报告全局绑定与本地绑定的阴影,以进一步了解您的问题。 – chi
'TypeRep'应该会在GHC 8.2中发生大的变化。如果发生这种情况,你可能会发现它比现在更有用。 – dfeuer