คำถามติดแท็ก typeclass

10
อินเตอร์เฟสของ Java และคลาสประเภทของ Haskell: ความแตกต่างและความคล้ายคลึงกัน?
ในขณะที่ฉันเรียนรู้ Haskell ฉันสังเกตเห็นประเภทของคลาสซึ่งน่าจะเป็นสิ่งประดิษฐ์ที่ยอดเยี่ยมที่มีต้นกำเนิดจาก Haskell อย่างไรก็ตามในหน้า Wikipedia ในประเภทคลาส : โปรแกรมเมอร์กำหนดคลาสประเภทโดยการระบุชุดของฟังก์ชันหรือชื่อคงที่พร้อมกับประเภทที่เกี่ยวข้องซึ่งต้องมีอยู่สำหรับทุกประเภทที่เป็นของคลาส ซึ่งดูเหมือนจะค่อนข้างใกล้เคียงกับอินเทอร์เฟซของ Java สำหรับฉัน (อ้างถึงหน้าอินเทอร์เฟซ (Java) ของ Wikipedia ): อินเทอร์เฟซในภาษาโปรแกรม Java เป็นประเภทนามธรรมที่ใช้เพื่อระบุส่วนต่อประสาน (ในความหมายทั่วไปของคำศัพท์) ที่คลาสต้องใช้ สองสิ่งนี้ดูค่อนข้างคล้ายกัน: คลาสประเภท จำกัด พฤติกรรมของประเภทในขณะที่อินเทอร์เฟซ จำกัด พฤติกรรมของคลาส ฉันสงสัยว่าความแตกต่างและความคล้ายคลึงกันระหว่างประเภทคลาสใน Haskell และอินเทอร์เฟซใน Java คืออะไรหรืออาจแตกต่างกันโดยพื้นฐาน แก้ไข:ผมสังเกตเห็นแม้ยอมรับ haskell.org ว่าพวกเขามีความคล้ายคลึงกัน ถ้าพวกมันคล้ายกันมาก (หรือพวกมัน?) แล้วทำไม type class ถึงได้รับการยกย่องเช่นนี้? แก้ไขเพิ่มเติม:ว้าวคำตอบที่ยอดเยี่ยมมากมาย! ฉันเดาว่าฉันจะต้องปล่อยให้ชุมชนตัดสินใจว่าอันไหนดีที่สุด อย่างไรก็ตามในขณะที่อ่านคำตอบทั้งหมดของพวกเขาดูเหมือนจะเป็นเพียงแค่บอกว่า"มีหลายสิ่ง typeclass สามารถทำในขณะที่อินเตอร์เฟซที่ไม่สามารถหรือต้องรับมือกับข้อมูลทั่วไป" ฉันอดไม่ได้ที่จะสงสัยว่ามีอินเทอร์เฟซใดบ้างที่สามารถทำได้ในขณะที่แว่นตาพิมพ์ไม่สามารถทำได้ นอกจากนี้ฉันสังเกตเห็นว่า Wikipedia …

2
Comonad typeclass ใน Haskell คืออะไร?
Comonad typeclass ใน Haskell คืออะไร? เช่นเดียวกับใน Comonad จากControl.Comonad ในแพ็คเกจ comonad (ยินดีต้อนรับคำอธิบายของแพ็คเกจอื่น ๆ ที่มีคลาสประเภท Comonad ด้วย) ผมเคยได้ยินเกี่ยวกับราง Comonad แต่ทั้งหมดที่ผมรู้เกี่ยวกับมันว่าจะให้extract :: w a -> aเรียงลำดับของขนานไป return :: a -> m aMonad คะแนนโบนัสสำหรับการสังเกตการใช้งาน Comonad แบบ "ชีวิตจริง" ในโค้ด "ของจริง"

3
การได้มาทำงานอย่างไรใน Haskell?
พีชคณิตประเภทข้อมูล (ADTs) ใน Haskell จะกลายเป็นกรณีของบางอย่างโดยอัตโนมัติ typeclasse s (เช่นShow,Eq) โดยสืบมาจากพวกเขา data Maybe a = Nothing | Just a deriving (Eq, Ord) คำถามของฉันคือวิธีการderivingทำงานเช่น Haskell รู้วิธีใช้ฟังก์ชันของคลาสประเภทที่ได้รับสำหรับ ADT ที่ได้รับมาได้อย่างไร นอกจากนี้เหตุใดจึงderivingจำกัด เฉพาะแว่นตาบางประเภทเท่านั้น เหตุใดฉันจึงไม่สามารถเขียนคลาสประเภทของตัวเองที่สามารถรับมาได้

6
อินสแตนซ์ Orphaned ใน Haskell
เมื่อรวบรวมแอปพลิเคชัน Haskell ของฉันด้วย-Wallตัวเลือก GHC จะบ่นเกี่ยวกับอินสแตนซ์ที่ไม่มีเจ้าของตัวอย่างเช่น: Publisher.hs:45:9: Warning: orphan instance: instance ToSElem Result ชั้นประเภทToSElemจะไม่ระเบิดก็กำหนดโดยHStringTemplate ตอนนี้ฉันรู้วิธีแก้ไขแล้ว (ย้ายการประกาศอินสแตนซ์ไปไว้ในโมดูลที่มีการประกาศผลลัพธ์) และฉันรู้ว่าทำไม GHC จึงต้องการหลีกเลี่ยงอินสแตนซ์ที่ไม่มีเจ้าของ แต่ฉันก็ยังเชื่อว่าวิธีของฉันดีกว่า ฉันไม่สนใจว่าคอมไพเลอร์จะไม่สะดวก - แทนที่จะเป็นฉัน เหตุผลที่ฉันต้องการประกาศไฟล์ ToSElemอินสแตนซ์ในโมดูลผู้เผยแพร่เนื่องจากเป็นโมดูลผู้เผยแพร่ที่ขึ้นอยู่กับ HStringTemplate ไม่ใช่โมดูลอื่น ๆ ฉันพยายามแยกความกังวลและหลีกเลี่ยงไม่ให้ทุกโมดูลขึ้นอยู่กับ HStringTemplate ฉันคิดว่าข้อดีอย่างหนึ่งของคลาสประเภทของ Haskell เมื่อเปรียบเทียบกับอินเทอร์เฟซของ Java คือเป็นแบบเปิดมากกว่าปิดดังนั้นจึงไม่จำเป็นต้องประกาศอินสแตนซ์ในตำแหน่งเดียวกับประเภทข้อมูล คำแนะนำของ GHC ดูเหมือนจะเพิกเฉยต่อสิ่งนี้ ดังนั้นสิ่งที่ฉันกำลังมองหาคือการตรวจสอบความถูกต้องว่าความคิดของฉันเป็นสิ่งที่ดีและฉันจะมีเหตุผลที่จะเพิกเฉย / ระงับคำเตือนนี้หรือการโต้แย้งที่น่าเชื่อกว่าในการทำสิ่งต่างๆในแบบของฉัน
87 haskell  ghc  typeclass 

4
เหตุใดฉันจึงไม่สามารถทำให้ String เป็นอินสแตนซ์ของประเภทคลาสได้
ให้ : data Foo = FooString String … class Fooable a where --(is this a good way to name this?) toFoo :: a -> Foo ฉันต้องการสร้างStringตัวอย่างของFooable: instance Fooable String where toFoo = FooString GHC ก็บ่นว่า: Illegal instance declaration for `Fooable String' (All instance types must be of the form (T …

1
Ord ที่สืบทอดมาพร้อมกับข้อ จำกัด เชิงปริมาณ (forall a. Ord a => Ord (fa))
ด้วยข้อ จำกัด เชิงปริมาณฉันสามารถหามาใช้ได้Eq (A f)หรือไม่ อย่างไรก็ตามเมื่อฉันพยายามหา Ord (A f) มันล้มเหลว ฉันไม่เข้าใจวิธีใช้ข้อ จำกัด เชิงปริมาณเมื่อคลาสข้อ จำกัด มีซูเปอร์คลาส ฉันจะดูOrd (A f)คลาสอื่นที่มีซูเปอร์คลาสได้อย่างไร > newtype A f = A (f Int) > deriving instance (forall a. Eq a => Eq (f a)) => Eq (A f) > deriving instance (forall a. Ord a => Ord …

1
การสร้างการต่อข้อมูลที่สัมพันธ์กันอย่างสมบูรณ์
ความจริงที่ดีเกี่ยวกับการต่อเรียงคือถ้าฉันรู้ว่ามีสองตัวแปรในสมการ: a ++ b = c จากนั้นฉันก็รู้สาม ฉันต้องการที่จะจับภาพความคิดนี้ใน concat ของตัวเองดังนั้นฉันจึงใช้การพึ่งพาการทำงาน {-# Language DataKinds, GADTs, FlexibleContexts, FlexibleInstances, FunctionalDependencies, KindSignatures, PolyKinds, TypeOperators, UndecidableInstances #-} import Data.Kind (Type) class Concatable (m :: k -> Type) (as :: k) (bs :: k) (cs :: k) | as bs -> cs , as cs -> …

1
เหตุใด“ เคล็ดลับข้อ จำกัด ” จึงไม่ทำงานในอินสแตนซ์ HasField ที่กำหนดด้วยตนเองนี้
ฉันมีรหัส (แปลก ๆ ที่ยอมรับ) ซึ่งใช้เลนส์และGHC บันทึก : {-# LANGUAGE DataKinds, PolyKinds, FlexibleInstances, UndecidableInstances #-} {-# LANGUAGE MultiParamTypeClasses #-} {-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE TypeApplications #-} {-# LANGUAGE TypeFamilies #-} module Main where import Control.Lens import GHC.Records data Glass r = Glass -- just a dumb proxy class Glassy r …

1
การส่งแบบสแตติกประเภทโดยนัย (การบีบบังคับ) ใน Haskell
ปัญหา พิจารณาปัญหาการออกแบบต่อไปนี้ใน Haskell ฉันมีความเรียบง่าย, EDSL สัญลักษณ์ที่ฉันต้องการที่จะแสดงตัวแปรและการแสดงออกทั่วไป (มีหลายชื่อหลายตัวแปร) x^2 * y + 2*z + 1เช่น นอกจากนี้ผมต้องการที่จะแสดงสมสัญลักษณ์บางกว่าการแสดงออกการพูดx^2 + 1 = 1เช่นเดียวกับคำนิยามx := 2*y - 2เช่น เป้าหมายคือ: มีประเภทที่แยกต่างหากสำหรับตัวแปรและนิพจน์ทั่วไป - ฟังก์ชันบางอย่างอาจนำไปใช้กับตัวแปรและไม่ใช่นิพจน์ที่ซับซ้อน ตัวอย่างเช่นตัวดำเนินการคำนิยาม:=อาจเป็นประเภท (:=) :: Variable -> Expression -> Definitionและไม่ควรส่งผ่านนิพจน์ที่ซับซ้อนเป็นพารามิเตอร์ด้านซ้ายมือ (แม้ว่ามันจะเป็นไปได้ที่จะส่งตัวแปรเป็นพารามิเตอร์ด้านขวาโดยไม่ต้องมีการแคสต์อย่างชัดเจน ) . มีตัวอย่างของนิพจน์Numเพื่อให้สามารถส่งเสริมตัวอักษรจำนวนเต็มเป็นนิพจน์และใช้สัญลักษณ์ที่สะดวกสำหรับการดำเนินการเกี่ยวกับพีชคณิตทั่วไปเช่นการบวกหรือการคูณโดยไม่ต้องแนะนำตัวดำเนินการ wrapper เสริม ในคำอื่น ๆ ผมอยากจะมีนัยและคงประเภทหล่อ (บังคับ) ของตัวแปรที่จะแสดงออก ตอนนี้ฉันรู้แล้วว่าไม่มีการปลดเปลื้องประเภทใน Haskell อย่างไรก็ตามแนวคิดการเขียนโปรแกรมเชิงวัตถุบางอย่าง (การสืบทอดง่าย …
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.