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

Haskell เป็นภาษาโปรแกรมที่ใช้งานได้มีการพิมพ์แบบสแตติกการประเมินแบบสันหลังยาวการขนานอย่างกว้างขวางและการสนับสนุนการทำงานพร้อมกัน

5
อะไรที่แย่เกี่ยวกับ Lazy I / O?
ฉันได้ยินมาโดยทั่วไปว่ารหัสการผลิตควรหลีกเลี่ยงการใช้ Lazy I / O คำถามของฉันคือทำไม? เป็นเรื่องปกติหรือไม่ที่จะใช้ Lazy I / O นอกเหนือจากการเล่นเฉยๆ? และอะไรทำให้ทางเลือกอื่น (เช่นตัวนับ) ดีกว่า?

5
ประเภทที่สูงกว่ามีประโยชน์เมื่อใด
ฉันทำ dev ใน F # มาระยะหนึ่งแล้วและฉันก็ชอบมัน อย่างไรก็ตามคำศัพท์หนึ่งที่ฉันรู้ว่าไม่มีอยู่ใน F # เป็นประเภทที่สูงกว่า ฉันได้อ่านเนื้อหาเกี่ยวกับประเภทที่สูงกว่าและฉันคิดว่าฉันเข้าใจคำจำกัดความของพวกเขา ฉันไม่แน่ใจว่าเหตุใดจึงมีประโยชน์ ใครช่วยยกตัวอย่างว่าประเภทที่สูงกว่าทำให้ง่ายใน Scala หรือ Haskell ที่ต้องใช้วิธีแก้ปัญหาใน F # สำหรับตัวอย่างเหล่านี้วิธีแก้ปัญหาจะเป็นอย่างไรหากไม่มีประเภทสูงกว่า (หรือในทางกลับกันใน F #) บางทีฉันอาจจะชินกับการทำงานกับมันมากจนฉันไม่สังเกตเห็นว่าไม่มีฟีเจอร์นั้น (ฉันคิดว่า) ฉันเข้าใจว่าแทนที่จะเป็นประเภทที่ดีกว่าmyList |> List.map fหรือmyList |> Seq.map f |> Seq.toListสูงกว่าช่วยให้คุณเขียนได้ง่ายๆmyList |> map fและมันจะส่งกลับ a List. มันเยี่ยมมาก (สมมติว่าถูกต้อง) แต่ดูเหมือนจะไม่สุภาพ? (และไม่สามารถทำได้ง่ายๆโดยปล่อยให้ฟังก์ชันโอเวอร์โหลด) ฉันมักจะแปลงเป็นSeqอย่างไรก็ตามจากนั้นฉันสามารถแปลงเป็นอะไรก็ได้ที่ฉันต้องการในภายหลัง อีกครั้งบางทีฉันก็ชินเกินไปที่จะทำงานกับมัน แต่จะมีตัวอย่างที่ใดประเภทสูง kinded จริงๆช่วยให้คุณประหยัดทั้งในการกดแป้นพิมพ์หรือในรูปแบบความปลอดภัย?

7
เหตุใดการเขียนคอมไพเลอร์ในภาษาที่ใช้งานได้จึงง่ายกว่า [ปิด]
ปิด . คำถามนี้เป็นคำถามความคิดเห็นตาม ขณะนี้ยังไม่ยอมรับคำตอบ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามเพื่อให้สามารถตอบได้ด้วยข้อเท็จจริงและการอ้างอิงโดยแก้ไขโพสต์นี้ ปิดให้บริการใน2 ปีที่ผ่านมา ปรับปรุงคำถามนี้ ฉันคิดถึงคำถามนี้มานานมาก แต่ก็ไม่พบคำตอบใน Google และคำถามที่คล้ายกันใน Stackoverflow หากมีการซ้ำกันขออภัยด้วย หลายคนดูเหมือนจะพูดว่าการเขียนคอมไพเลอร์และเครื่องมือภาษาอื่น ๆ ในภาษาที่ใช้งานได้เช่น OCaml และ Haskell นั้นมีประสิทธิภาพมากกว่าและง่ายกว่ามากจากนั้นจึงเขียนเป็นภาษาที่จำเป็น นี่คือเรื่องจริง? และถ้าเป็นเช่นนั้น - เหตุใดจึงมีประสิทธิภาพและง่ายในการเขียนเป็นภาษาที่ใช้งานได้แทนที่จะเป็นภาษาที่จำเป็นเช่น C? นอกจากนี้ - ไม่ใช่เครื่องมือภาษาในภาษาที่ใช้งานได้ช้ากว่าในภาษาระดับต่ำเช่น C หรือไม่?


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 

6
Dot Operator ใน Haskell: ต้องการคำอธิบายเพิ่มเติม
ฉันพยายามทำความเข้าใจว่าตัวดำเนินการ dot ทำอะไรในรหัส Haskell นี้: sumEuler = sum . (map euler) . mkList ซอร์สโค้ดทั้งหมดอยู่ด้านล่าง ความเข้าใจของฉัน ตัวดำเนินการ dot กำลังรับฟังก์ชันทั้งสองsumและผลลัพธ์ของmap eulerและผลลัพธ์ของmkListเป็นอินพุต แต่sumฟังก์ชันไม่ใช่อาร์กิวเมนต์ของฟังก์ชันใช่ไหม? เกิดอะไรขึ้นที่นี่? นอกจากนี้สิ่งที่กำลัง(map euler)ทำอยู่? รหัส mkList :: Int -> [Int] mkList n = [1..n-1] euler :: Int -> Int euler n = length (filter (relprime n) (mkList n)) sumEuler :: Int …

1
เหตุใดรหัส Haskell นี้จึงทำงานช้าลงด้วย -O
ชิ้นส่วนของรหัส Haskell นี้จะทำงานมากช้า-Oแต่-Oควรจะไม่เป็นอันตราย ใครช่วยบอกทีว่าเกิดอะไรขึ้น? หากเป็นเรื่องสำคัญมันเป็นความพยายามที่จะแก้ปัญหานี้และใช้การค้นหาแบบไบนารีและโครงสร้างส่วนต่อเนื่อง import Control.Monad import Data.Array data Node = Leaf Int -- value | Branch Int Node Node -- sum, left child, right child type NodeArray = Array Int Node -- create an empty node with range [l, r) create :: Int -> Int -> Node create …

2
ตรรกะเชิงผสมที่เทียบเท่ากับทฤษฎีประเภทสัญชาตญาณคืออะไร?
ฉันเพิ่งเรียนจบหลักสูตรของมหาวิทยาลัยซึ่งเป็นจุดเด่นของ Haskell และ Agda (ภาษาการเขียนโปรแกรมเชิงฟังก์ชันที่ขึ้นอยู่กับตัวพิมพ์) และสงสัยว่าจะสามารถแทนที่แคลคูลัสแลมบ์ดาด้วยตรรกะผสมได้หรือไม่ ด้วย Haskell สิ่งนี้ดูเหมือนจะเป็นไปได้โดยใช้ตัวรวม S และ K จึงทำให้ไม่มีจุด ฉันสงสัยว่า Agda เทียบเท่ากับอะไร กล่าวคือเราสามารถสร้างภาษาการเขียนโปรแกรมเชิงฟังก์ชันที่พิมพ์ขึ้นโดยพึ่งพา Agda โดยไม่ใช้ตัวแปรใด ๆ ได้หรือไม่? นอกจากนี้ยังสามารถแทนที่การหาปริมาณด้วยตัวผสมได้หรือไม่? ฉันไม่รู้ว่านี่เป็นเรื่องบังเอิญ แต่ตัวอย่างเช่นการหาปริมาณสากลทำให้ลายเซ็นประเภทดูเหมือนนิพจน์แลมบ์ดา มีวิธีลบการหาปริมาณสากลออกจากลายเซ็นโดยไม่เปลี่ยนความหมายหรือไม่? เช่นใน: forall a : Int -> a < 0 -> a + a < a สามารถแสดงสิ่งเดียวกันโดยไม่ใช้ forall ได้หรือไม่?

1
ฉันจะให้ esqueleto สร้างสตริง SQL ให้ฉันได้อย่างไร
ฉันจะให้ esqueleto สร้างสตริง SQL จากfromคำสั่งได้อย่างไร เอกสารtoRawSqlระบุว่า "คุณสามารถเปิดการบันทึกการสืบค้นแบบถาวร" ฉันลองใช้รูปแบบที่เป็นไปได้ทั้งหมดMonadLoggerที่ฉันเข้าใจ แต่ไม่เคยพิมพ์ SQL เลย เอกสารฉบับเดียวกันยังระบุว่า "การใช้ฟังก์ชันนี้ด้วยตนเอง ... เป็นไปได้ แต่น่าเบื่อ" อย่างไรก็ตามยังไม่มีการก่อสร้างงานประเภทหรือฟังก์ชั่นใด ๆ ค่าชนิดที่กลับมาQueryTypeจะถูกส่งออก ฉันจัดการเพื่อหลีกเลี่ยงสิ่งนี้โดยสังเกตว่าQueryTypeเป็นnewtypeและใช้unsafeCoerce! ฉันยังถูกบังคับให้ระบุConnection(ซึ่งฉันได้รับจาก SQLite) แม้ว่าจะไม่จำเป็นต้องเชื่อมต่อกับฐานข้อมูลเพื่อสร้าง SQL ก็ตาม นี่คือสิ่งที่ฉันมี ต้องมีวิธีที่ดีกว่านี้ withSqliteConn ":memory:" $ \conn -> return $ toRawSql SELECT (unsafeCoerce ((const mempty) :: a -> Text.Lazy.Builder.Builder)) (conn, initialIdentState) myFromStatement) http://hackage.haskell.org/package/esqueleto-1.3.4.2/docs/Database-Esqueleto-Internal-Sql.html

17
ภาษาอะไรที่จะเรียนรู้หลังจาก Haskell? [ปิด]
ตามที่กล่าวมาในปัจจุบันคำถามนี้ไม่เหมาะสำหรับรูปแบบถาม & ตอบของเรา เราคาดหวังว่าคำตอบจะได้รับการสนับสนุนจากข้อเท็จจริงการอ้างอิงหรือความเชี่ยวชาญ แต่คำถามนี้อาจก่อให้เกิดการถกเถียงโต้แย้งการสำรวจความคิดเห็นหรือการอภิปรายเพิ่มเติม หากคุณรู้สึกว่าคำถามนี้สามารถปรับปรุงได้และอาจเปิดขึ้นมาใหม่ได้โปรดไปที่ศูนย์ช่วยเหลือเพื่อรับคำแนะนำ ปิดให้บริการใน9 ปีที่ผ่านมา ล็อค คำถามนี้และคำตอบถูกล็อกเนื่องจากคำถามไม่ตรงประเด็น แต่มีความสำคัญทางประวัติศาสตร์ ขณะนี้ยังไม่ยอมรับคำตอบหรือการโต้ตอบใหม่ ในฐานะภาษาโปรแกรมแรกของฉันฉันจึงตัดสินใจเรียน Haskell ฉันเป็นวิชาเอกปรัชญาการวิเคราะห์และ Haskell อนุญาตให้ฉันสร้างโปรแกรมที่น่าสนใจได้อย่างรวดเร็วและถูกต้องตัวอย่างเช่นทรานสดิวเซอร์สำหรับการแยกวิเคราะห์ภาษาธรรมชาติผู้พิสูจน์ทฤษฎีบทและล่าม แม้ว่าฉันจะเขียนโปรแกรมเพียงสองเดือนครึ่ง แต่ฉันพบว่าความหมายและไวยากรณ์ของ Haskell เรียนรู้ได้ง่ายกว่าภาษาที่จำเป็นแบบเดิม ๆ มากและรู้สึกสบายใจ (ตอนนี้) กับโครงสร้างส่วนใหญ่ อย่างไรก็ตามการเขียนโปรแกรมใน Haskell เป็นเหมือนเวทมนตร์และฉันต้องการเพิ่มพูนความรู้เกี่ยวกับการเขียนโปรแกรม ฉันต้องการเลือกภาษาการเขียนโปรแกรมใหม่เพื่อเรียนรู้ แต่ฉันไม่มีเวลามากพอที่จะเลือกภาษาใดภาษาหนึ่งวางและทำซ้ำ ดังนั้นฉันคิดว่าฉันจะตั้งคำถามที่นี่พร้อมกับข้อกำหนดหลายประการเกี่ยวกับประเภทของภาษาที่ฉันกำลังมองหา บางคนเป็นเรื่องส่วนตัวบางคนมีจุดมุ่งหมายเพื่อลดการเปลี่ยนจาก Haskell ระบบชนิดที่แข็งแกร่ง ส่วนหนึ่งที่ฉันชอบที่สุดในการเขียนโปรแกรมใน Haskell คือการเขียนประกาศประเภท สิ่งนี้ช่วยจัดโครงสร้างความคิดของฉันเกี่ยวกับฟังก์ชันส่วนบุคคลและความสัมพันธ์กับโปรแกรมโดยรวม นอกจากนี้ยังทำให้การให้เหตุผลอย่างไม่เป็นทางการเกี่ยวกับความถูกต้องของโปรแกรมของฉันง่ายขึ้น ฉันกังวลกับความถูกต้องไม่ใช่ประสิทธิภาพ เน้นการเรียกซ้ำมากกว่าการวนซ้ำ ฉันใช้โครงสร้างแบบวนซ้ำใน Haskell แต่ใช้แบบวนซ้ำ อย่างไรก็ตามการทำความเข้าใจโครงสร้างของฟังก์ชันวนซ้ำนั้นง่ายกว่าขั้นตอนการวนซ้ำที่ซับซ้อนโดยเฉพาะเมื่อใช้ตัวรวมและฟังก์ชันลำดับที่สูงกว่าเช่นแผนที่การพับและการผูก ให้รางวัลกับการเรียนรู้ Haskell เป็นภาษาที่คุ้มค่าในการทำงานมันเหมือนกับการอ่าน Kant ประสบการณ์ของฉันเมื่อหลายปีก่อนกับ …

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
จะอ่าน "หลักฐาน" ของ GHC Core นี้ได้อย่างไร
ฉันเขียน Haskell เล็กน้อยเพื่อหาว่า GHC พิสูจน์ได้อย่างไรว่าสำหรับจำนวนธรรมชาติคุณสามารถลดจำนวนคู่ลงครึ่งหนึ่งเท่านั้น: {-# LANGUAGE DataKinds, GADTs, KindSignatures, TypeFamilies #-} module Nat where data Nat = Z | S Nat data Parity = Even | Odd type family Flip (x :: Parity) :: Parity where Flip Even = Odd Flip Odd = Even data ParNat :: Parity -> …

3
“ ฟังก์ชั่นบางส่วน” ในการเขียนโปรแกรมฟังก์ชั่นคืออะไร?
ตามความเข้าใจของฉันฟังก์ชั่นบางส่วนเป็นฟังก์ชั่นที่เราได้รับโดยส่งพารามิเตอร์น้อยลงไปยังฟังก์ชั่นมากกว่าที่คาด ตัวอย่างเช่นถ้าสิ่งนี้ถูกต้องใน Python โดยตรง: >>> def add(x,y): ... return x+y ... >>> new_function = add(1) >>> new_function(2) 3 ในตัวอย่างด้านบนnew_functionเป็นฟังก์ชันบางส่วน อย่างไรก็ตามตามHaskell Wikiความหมายของฟังก์ชั่นบางส่วนคือ ฟังก์ชั่นบางส่วนเป็นฟังก์ชั่นที่ไม่ได้กำหนดไว้สำหรับข้อโต้แย้งที่เป็นไปได้ทั้งหมดของประเภทที่ระบุ ดังนั้นคำถามของฉันคืออะไร "ฟังก์ชั่นบางส่วน" หมายถึงอะไร?

2
วิธีลดการทำสำเนารหัสเมื่อจัดการกับประเภทผลรวมซ้ำ
ฉันกำลังทำงานกับล่ามง่าย ๆ สำหรับภาษาการเขียนโปรแกรมและฉันมีชนิดข้อมูลเช่นนี้: data Expr = Variable String | Number Int | Add [Expr] | Sub Expr Expr และฉันมีฟังก์ชั่นมากมายที่ทำสิ่งที่ง่ายเช่น: -- Substitute a value for a variable substituteName :: String -> Int -> Expr -> Expr substituteName name newValue = go where go (Variable x) | x == name = Number …

5
มีโอกาสใดบ้างที่จะเขียน“ C major” แทน“ Major C”?
ฉันพบปัญหาเกี่ยวกับสุนทรียศาสตร์เล็กน้อยในโครงการดนตรีของฉันและมันก็บั่นทอนฉันมาระยะหนึ่งแล้ว ฉันมีชนิดdata Key = C | D | ...และฉันสามารถสร้างScaleจากและKey ModeความModeแตกต่างระหว่างเช่นขนาดใหญ่และขนาดเล็ก ฉันสามารถกำหนดModeประเภทเป็นฟังก์ชั่นจากไปKey Scaleในกรณีนั้นโหมดจะมีชื่อตัวพิมพ์เล็ก (ซึ่งใช้ได้) และฉันสามารถรับสเกลได้เช่นนี้ aScale = major C แต่นักดนตรีจะไม่พูดเช่นนี้ พวกเขาอ้างถึงขนาดนี้เป็นC ที่สำคัญขนาดไม่c เมเจอร์สเกล สิ่งที่ฉันต้องการ เป็นการดีที่ฉันต้องการเขียน aScale = C major เป็นไปได้ทั้งหมดหรือไม่ สิ่งที่ฉันพยายาม ฉันสามารถสร้างKeyฟังก์ชั่นที่สร้างScaleจาก a Modeดังนั้นฉันจึงเขียนได้ aScale = c Major แต่ฉันไม่สามารถ จำกัด กุญแจในการสร้างเครื่องชั่งได้ พวกเขามีความจำเป็นสำหรับสิ่งอื่น ๆ เช่นกัน (เช่นการสร้างคอร์ด ) นอกจากนี้ควรจะเป็นตัวอย่างของKeyShow ฉันสามารถใส่ModeหลังKeyเมื่อฉันใช้ฟังก์ชั่นพิเศษ (หรือตัวสร้างมูลค่า): aScale = …
39 haskell  dsl 

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.