gpt4 book ai didi

Haskell、GADT 和 -fwarn-incomplete-patterns

转载 作者:行者123 更新时间:2023-12-02 11:13:44 24 4
gpt4 key购买 nike

我正在尝试使用 Haskell 来了解 GADT 的概念,并尝试遵循 Peano Number 场景,

{-# LANGUAGE GADTs, KindSignatures, DataKinds #-}
module Data.GADTTest where

data Height = Zero | Inc Height deriving (Show, Eq)

data TestGADT :: Height -> * where
TypeCons1 :: TestGADT Zero
TypeCons2 :: Int -> TestGADT h -> TestGADT (Inc h)

testFunc :: TestGADT h -> TestGADT h -> Int
testFunc TypeCons1 TypeCons1 = 1
testFunc (TypeCons2 {}) (TypeCons2 {}) = 2

但是,我发现当我用 -fwarn-incomplete-patterns 编译它时标志(GHC-7.6.3),即使所有可能的模式都已得到满足,它也会给我以下警告:

Pattern match(es) are non-exhaustive
In an equation for `testFunc':
Patterns not matched:
TypeCons1 (TypeCons2 _ _)
(TypeCons2 _ _) TypeCons1

但是,当我包含这些模式中的任何一个的匹配时,如下所示:

testFunc TypeCons1 (TypeCons2 {})       = 3

编译器(正确地如此)给我以下错误:

Couldn't match type 'Zero with 'Inc h1
Inaccessible code in
a pattern with constructor
TypeCons2 :: forall (h :: Height).
Int -> TestGADT h -> TestGADT ('Inc h),
in an equation for `testFunc'
In the pattern: TypeCons2 {}
In an equation for `testFunc':
testFunc TypeCons1 (TypeCons2 {}) = 3

有没有办法在不添加testFunc _ _ = undefined的情况下编写这个函数或数据类型?本质上是 warn-incomplete-patterns 的行标记对此功能无用并用多余的丑陋垃圾弄乱我的代码?

最佳答案

一种方法是使用类型类:

class TestFunc a where
testFunc :: a -> a -> Int

instance TestFunc (TestGADT Zero) where
testFunc TypeCons1 TypeCons1 = 1
instance TestFunc (TestGADT (Inc h)) where
testFunc (TypeCons2 _ _) (TypeCons2 _ _) = 2

关于Haskell、GADT 和 -fwarn-incomplete-patterns,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19828880/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com