วิธีที่จะนิยามค่าคงที่ heterogeneous ที่บีดอัดอยู่ในภาษา haskelllanguage?

0

คำถาม

ฉันเข้าใจวิธีที่จะนิยามทั้งสอง homogeneous และ heterogeneous ที่บีดอัดอยู่ในภาษา haskelllanguage.

-- Type-invariant streams.
data InvStream a where
   (:::) :: a -> InvStream a -> InvStream a

-- Heterogeneous Streams.
data HStream :: InvStream * -> * where
   HCons :: x -> HStream xs -> HStream (x '::: xs)

แล้วพวกเราจะเป็นยังไงกำหนดเป็นอย่างต่อเนื่องสายข้อมูลที่เป็นกรณีพิเศษของ heterogeneous อสายข้อมูล? ถ้าฉันพยายามจะกำหนดประเภทครอบครัวของที่บีดอัดของอย่างต่อเนื่องประเภทฉันได้"การแก้งานเอ่อล้นออกมา"ข้อผิดพลาด ฉันจินตนาการนี้ต้องมีส่วนเกี่ยวข้องกับคนแบบดูอัลกอริธึมไม่ได้เป็นคนขี้เกียจมากพอแล้วพยายามที่จะสะทกสะทานเลยละสิตลอด Constant a สายข้อมูลของชนิด

type family Constant (a :: *) :: InvStream * where
  Constant a = a '::: Constant a

constantStream :: a -> HStream (Constant a)
constantStream x =  HCons x (constantStream x)

มีทางไหนไหมที่ฉันสามารถจะจัดการเรื่องนี้ปัญหาและนิยามค่าคงที่ heterogeneous ที่บีดอัด? มีอะไรอื่นที่คล้ายกันก่อสร้างฉันควรจะพยายามแทน?

coinduction haskell type-families
2021-11-23 14:45:20
1

คำตอบที่ดีที่สุด

9

นี่คือการสิ่งที่แยกความแตกต่างระหว่าง inductive และ เพื่อนร่วม inductive ชนิดซึ่งเราก็เหมือนอย่างเพื่อไม่สนใจในภาษา haskelllanguage. แต่คุณไม่สามารถทำอย่างนั้นอยู่คนประเภทขั้นเพราะคอมไพเลอร์ต้องการจะลักฐานใน finite เวลา

ดังนั้นสิ่งที่เราต้องการคือจริงๆแสดงออกประเภทระดับสายข้อมูลในเพื่อนร่วม inductive แฟชั่น:

{-# LANGUAGE GADTs, DataKinds, TypeFamilies #-}

import Data.Kind (Type)  -- The kind `*` is obsolete

class TypeStream (s :: Type) where
  type HeadS s :: Type
  type TailS s :: Type

data HStream s where
  HConsS :: HeadS s -> HStream (TailS s) -> HStream s

data Constant a

instance TypeStream (Constant a) where
  type HeadS (Constant a) = a
  type TailS (Constant a) = Constant a

constantStream :: a -> HStream (Constant a)
constantStream x = HConsS x (constantStream x)
2021-11-23 16:00:14

ในภาษาอื่นๆ

หน้านี้อยู่ในภาษาอื่นๆ

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................

ดังอยู่ในนี้หมวดหมู่

ดังคำถามอยู่ในนี้หมวดหมู่