gpt4 book ai didi

haskell - 为多态模式同义词编写完整的编译指示?

转载 作者:行者123 更新时间:2023-12-04 12:26:33 24 4
gpt4 key购买 nike

我有以下代码,但我不知道应该在 ?? 提供什么.还是多态模式不能完成?

{-# LANGUAGE PatternSynonyms #-}
{-# LANGUAGE ViewPatterns #-}

module Data.Tuple.Single.Class
( Single (..)
, pattern Single
) where

class Single t where
wrap :: a -> t a
unwrap :: t a -> a

pattern Single :: Single t => a -> t a
pattern Single a <- (unwrap -> a) where
Single a = wrap a

{-# COMPLETE Single :: ?? #-}

GHC document说当所有的 conlike 都是多态的时,你必须输入 conlike。

制作时 ?? () ,编译成功。但是 () 是什么意思?意思是? GHC 表示仍然没有详尽的使用情况。

{-# LANGUAGE PatternSynonyms #-}

{-# OPTIONS_GHC -Wno-orphans #-}

module Data.Tuple.Single.Only
( Single (..)
, pattern Single
) where

import Data.Tuple.Only (Only (Only, fromOnly))
import Data.Tuple.Single.Class (Single (unwrap, wrap), pattern Single)

instance Single Only where
wrap = Only
unwrap = fromOnly

ghci> Single a = wrap 1 :: Only Int

<interactive>:2:1: warning: [-Wincomplete-uni-patterns]
Pattern match(es) are non-exhaustive
In a pattern binding: Patterns not matched: _
  • GHC 8.6.5
  • 最佳答案

    我不是 PatternSynonyms 方面的专家,但从外观上看,在多态模式的情况下,我们需要指定使它们完整的确切类型。

    Only 的情况下这将是:

    {-# COMPLETE Single :: Only #-}

    为了举例,让我们添加另一个实例到 Single :


    instance Single Identity where
    wrap = Identity
    unwrap (Identity a) = a

    pattern Single :: Single t => a -> t a
    pattern Single a <- (unwrap -> a) where
    Single a = wrap a

    {-# COMPLETE Single :: Only #-}
    {-# COMPLETE Single :: Identity #-}

    这让 GHC 不再提示:

    λ> Single a = wrap 1 :: Identity Int
    λ> Single a = wrap 1 :: Only Int

    关于haskell - 为多态模式同义词编写完整的编译指示?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56821863/

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