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

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


1
ข้อยกเว้นใน Yesod
ฉันได้สร้างภูตที่ใช้รูปแบบดั้งเดิมของipc(เทลเน็ตและส่งสตริงที่มีคำบางคำตามลำดับ) ฉันหักออกและตอนนี้กำลังใช้JSONเพื่อส่งข้อความไปยังYesodเซิร์ฟเวอร์ อย่างไรก็ตามมีบางสิ่งที่ฉันชอบมากเกี่ยวกับการออกแบบของฉันและฉันไม่แน่ใจว่าตอนนี้ตัวเลือกของฉันคืออะไร นี่คือสิ่งที่ฉันกำลังทำ: buildManager :: Phase -> IO () buildManager phase = do let buildSeq = findSeq phase jid = JobID $ pack "8" config = MkConfig $ Just jid flip C.catch exceptionHandler $ runReaderT (sequence_ $ buildSeq <*> stages) config -- ^^ I would really like to keep …

3
ทำไม ghci desugar จึงพิมพ์รายการและพิมพ์ครอบครัว สามารถเลือกปิดใช้งานได้หรือไม่?
ฉันกำลังพยายามทำให้ประเภท ghci แสดงสำหรับไลบรารีของฉันให้ใช้งานง่ายที่สุด แต่ฉันพบปัญหามากมายเมื่อใช้คุณสมบัติประเภทขั้นสูงเพิ่มเติม สมมติว่าฉันมีรหัสนี้ในไฟล์: {-# LANGUAGE TypeFamilies #-} {-# LANGUAGE DataKinds #-} {-# LANGUAGE TypeOperators #-} import GHC.TypeLits data Container (xs::[*]) = Container ฉันโหลดเป็น ghci จากนั้นพิมพ์คำสั่งต่อไปนี้: ghci> :t undefined :: Container '[String,String,String,String,String] น่าเสียดายที่ ghci ทำให้ฉันดูค่อนข้างน่าเกลียด: :: Container ((':) * String ((':) * String ((':) * String ((':) * String …
93 haskell  types  ghci 

3
การจัดลำดับพารามิเตอร์เพื่อใช้ในการแกง
ฉันมีโค้ด refactored สองครั้งเมื่อเร็ว ๆ นี้เพื่อเปลี่ยนลำดับของพารามิเตอร์เนื่องจากมีโค้ดมากเกินไปที่แฮ็กชอบflipหรือ\x -> foo bar x 42เกิดขึ้น เมื่อออกแบบลายเซ็นฟังก์ชันหลักการใดบ้างที่จะช่วยให้ฉันใช้แกงกะหรี่ให้เกิดประโยชน์สูงสุด

9
ภาษาการเขียนโปรแกรมเชิงฟังก์ชันทำงานอย่างไร
หากภาษาโปรแกรมที่ใช้งานได้ไม่สามารถบันทึกสถานะใด ๆ ได้พวกเขาจะทำสิ่งง่ายๆเช่นการอ่านอินพุตจากผู้ใช้อย่างไร พวกเขา "จัดเก็บ" อินพุต (หรือจัดเก็บข้อมูลสำหรับเรื่องนั้นอย่างไร) ตัวอย่างเช่นสิ่งที่ C ง่ายๆนี้จะแปลเป็นภาษาโปรแกรมที่ใช้งานได้เช่น Haskell ได้อย่างไร #include<stdio.h> int main() { int no; scanf("%d",&no); return 0; } (คำถามของฉันได้รับแรงบันดาลใจจากโพสต์ที่ยอดเยี่ยมนี้: "Execution in the Kingdom of Nouns" การอ่านมันทำให้ฉันเข้าใจดีขึ้นว่าการเขียนโปรแกรมเชิงวัตถุคืออะไร Java ใช้งานอย่างไรในลักษณะที่รุนแรงและภาษาโปรแกรมที่ใช้งานได้นั้นเป็นอย่างไร ตรงกันข้าม)

4
Exponentiation ใน Haskell
ใครช่วยบอกหน่อยได้ไหมว่าเหตุใด Haskell Prelude จึงกำหนดฟังก์ชันแยกกันสองฟังก์ชันสำหรับการยกกำลัง (เช่น^และ**) ฉันคิดว่าระบบประเภทควรจะกำจัดการทำซ้ำประเภทนี้ Prelude> 2^2 4 Prelude> 4**0.5 2.0

3
ความแตกต่างระหว่าง State, ST, IORef และ MVar
ฉันกำลังทำงานผ่านเขียนเองโครงการใน 48 ชั่วโมง (ฉันถึงประมาณ 85hrs) และผมเคยไปเป็นส่วนหนึ่งเกี่ยวกับการเพิ่มและการกำหนดตัวแปร ในบทนี้มีการกระโดดข้ามแนวความคิดครั้งใหญ่และฉันหวังว่ามันจะทำในสองขั้นตอนโดยมีการปรับโครงสร้างที่ดีระหว่างนั้นแทนที่จะกระโดดตรงไปที่ทางออกสุดท้าย อย่างไรก็ตาม… ผมเคยหายไปด้วยจำนวนของชั้นเรียนที่แตกต่างกันที่ดูเหมือนจะตอบสนองวัตถุประสงค์เดียวกัน: State, ST, และIORef MVarสามข้อแรกถูกกล่าวถึงในข้อความในขณะที่คำถามสุดท้ายน่าจะเป็นคำตอบที่ได้รับความนิยมสำหรับคำถาม StackOverflow จำนวนมากเกี่ยวกับสามข้อแรก พวกเขาทั้งหมดดูเหมือนจะมีสถานะระหว่างการวิงวอนติดต่อกัน สิ่งเหล่านี้คืออะไรและแตกต่างกันอย่างไร? โดยเฉพาะประโยคเหล่านี้ไม่สมเหตุสมผล: แต่เราใช้คุณลักษณะที่เรียกว่าเธรดสถานะโดยให้ Haskell จัดการสถานะรวมให้เรา สิ่งนี้ช่วยให้เราปฏิบัติกับตัวแปรที่เปลี่ยนแปลงได้เหมือนกับที่เราทำในภาษาโปรแกรมอื่น ๆ โดยใช้ฟังก์ชันเพื่อรับหรือตั้งค่าตัวแปร และ โมดูล IORef ช่วยให้คุณสามารถใช้ตัวแปร stateful ภายใน monad ทั้งหมดนี้ทำให้สายtype ENV = IORef [(String, IORef LispVal)]สับสน - ทำไมต้องเป็นครั้งที่สองIORef? อะไรจะพังถ้าฉันจะเขียนtype ENV = State [(String, LispVal)]แทน

3
mtl, หม้อแปลง, monads-fd, monadLib และความขัดแย้งของทางเลือก
Hackage มีหลายแพ็คเกจสำหรับ monad transformers: mtl : ห้องสมุดหม้อแปลง Monad หม้อแปลง : คอนกรีต functor และ monad transformers monads-fd : คลาส Monad โดยใช้การพึ่งพาการทำงาน monads-tf : คลาส Monad โดยใช้ประเภทครอบครัว monadLib : ชุดของหม้อแปลง monad mtl-tf : ไลบรารีหม้อแปลง Monad โดยใช้ตระกูลประเภท mmtl : ไลบรารีหม้อแปลง Modular Monad mtlx : ไลบรารีหม้อแปลง Monad พร้อมดัชนีประเภทให้สำเนา 'ฟรี' compose-trans : หม้อแปลง monad ที่ประกอบได้ …

3
โค้ด Haskell ที่สับสนนี้ทำงานอย่างไร
ในขณะที่อ่านhttps://en.uncyclopedia.co/wiki/Haskell (และเพิกเฉยต่อสิ่งที่ "น่ารังเกียจ" ทั้งหมด) ฉันสะดุดกับโค้ดที่สับสนต่อไปนี้: fix$(<$>)<$>(:)<*>((<$>((:[{- thor's mother -}])<$>))(=<<)<$>(*)<$>(*2))$1 เมื่อฉันรันโค้ดส่วนนั้นในghci(หลังจากนำเข้าData.FunctionและControl.Applicative) ให้ghciพิมพ์รายการพาวเวอร์ทั้งหมดของ 2 โค้ดชิ้นนี้ทำงานอย่างไร?
90 haskell 

15
เขียนล่าม Haskell ใน Haskell
แบบฝึกหัดการเขียนโปรแกรมแบบคลาสสิกคือการเขียนล่าม Lisp / Scheme ใน Lisp / Scheme พลังของภาษาเต็มสามารถใช้เพื่อสร้างล่ามสำหรับส่วนย่อยของภาษา มีการออกกำลังกายที่คล้ายกันสำหรับ Haskell หรือไม่? ฉันต้องการติดตั้งชุดย่อยของ Haskell โดยใช้ Haskell เป็นเครื่องยนต์ แน่นอนว่าสามารถทำได้ แต่มีแหล่งข้อมูลออนไลน์ให้ดูหรือไม่? นี่คือเรื่องราวเบื้องหลัง ฉันกำลังสำรวจแนวคิดในการใช้ Haskell เป็นภาษาเพื่อสำรวจแนวคิดบางอย่างในหลักสูตรโครงสร้างไม่ต่อเนื่องที่ฉันกำลังสอน สำหรับภาคการศึกษานี้ฉันได้ใช้มิแรนดาซึ่งเป็นภาษาเล็ก ๆ ที่เป็นแรงบันดาลใจให้ฮัสเคลล์ มิแรนดาทำประมาณ 90% ในสิ่งที่ฉันอยากทำ แต่ Haskell ทำประมาณ 2,000% :) ดังนั้นความคิดของฉันคือการสร้างภาษาที่มีคุณสมบัติของ Haskell ที่ฉันต้องการและไม่อนุญาตอย่างอื่น ในขณะที่นักเรียนก้าวหน้าขึ้นฉันสามารถเลือก "เปิด" คุณสมบัติต่างๆได้เมื่อพวกเขาเข้าใจพื้นฐานแล้ว "ระดับภาษา" การสอนถูกนำมาใช้เพื่อสอนJavaและSchemeได้สำเร็จ ด้วยการ จำกัด สิ่งที่ทำได้คุณสามารถป้องกันไม่ให้พวกเขายิงตัวตายในขณะที่พวกเขายังคงเชี่ยวชาญไวยากรณ์และแนวคิดที่คุณพยายามสอน และคุณสามารถเสนอข้อความแสดงข้อผิดพลาดที่ดีขึ้นได้

2
mapM แบบขนานบนอาร์เรย์ Repa
ในงานล่าสุดของฉันกับGibbs samplingฉันได้ใช้ประโยชน์อย่างRVarเต็มที่ซึ่งในมุมมองของฉันเป็นอินเทอร์เฟซที่เหมาะสำหรับการสร้างตัวเลขแบบสุ่ม น่าเศร้าที่ฉันไม่สามารถใช้ Repa ได้เนื่องจากไม่สามารถใช้การกระทำแบบ monadic ในแผนที่ได้ ในขณะที่แผนที่ monadic โดยทั่วไปไม่สามารถขนานกันได้อย่างชัดเจน แต่สำหรับฉันแล้วRVarอาจเป็นตัวอย่างของ monad อย่างน้อยหนึ่งตัวอย่างที่เอฟเฟกต์สามารถขนานกันได้อย่างปลอดภัย (อย่างน้อยตามหลักการฉันไม่คุ้นเคยกับการทำงานภายในของRVar) . กล่าวคือฉันต้องการเขียนสิ่งต่อไปนี้ drawClass :: Sample -> RVar Class drawClass = ... drawClasses :: Array U DIM1 Sample -> RVar (Array U DIM1 Class) drawClasses samples = A.mapM drawClass samples ที่A.mapMจะมีลักษณะบางอย่างเช่น mapM :: ParallelMonad m => (a …

3
สถานะของการใช้งาน Functional Reactive Programming ในปัจจุบันเป็นอย่างไร
ฉันพยายามนึกภาพระบบทางกายภาพอัตโนมัติง่ายๆ (เช่นลูกตุ้มแขนหุ่นยนต์ ฯลฯ ) ใน Haskell บ่อยครั้งที่ระบบเหล่านั้นสามารถอธิบายได้ด้วยสมการเช่น df/dt = c*f(t) + u(t) ที่u(t)แสดงถึง 'การควบคุมอัจฉริยะ' บางประเภท ระบบเหล่านี้ดูเหมือนจะเข้ากันได้ดีในกระบวนทัศน์การเขียนโปรแกรมปฏิกิริยาเชิงฟังก์ชัน ดังนั้นผมจึงคว้าหนังสือ "Haskell ของโรงเรียนในการแสดงออก" โดยพอลฮูดักและพบว่าเฉพาะโดเมนภาษา "FAL" (สำหรับฟังก์ชั่นนิเมชั่น Language) ที่นำเสนอมีการใช้งานได้จริงค่อนข้าง pleasently สำหรับระบบของเล่นที่เรียบง่ายของฉัน (แม้ว่าการทำงานบางอย่างสะดุดตาintegrate, ดูเหมือนจะขี้เกียจไปหน่อยสำหรับการใช้งานที่มีประสิทธิภาพ แต่แก้ไขได้ง่าย) คำถามของฉันคืออะไรที่เป็นทางเลือกสำหรับผู้ใหญ่ที่ทันสมัยได้รับการดูแลเป็นอย่างดีได้รับการปรับแต่งประสิทธิภาพสำหรับแอปพลิเคชันขั้นสูงหรือแม้แต่ในทางปฏิบัติในปัจจุบัน หน้าวิกินี้แสดงตัวเลือกต่างๆสำหรับ Haskell แต่ฉันไม่ชัดเจนเกี่ยวกับประเด็นต่อไปนี้: สถานะของ "ปฏิกิริยา" โครงการจาก Conal Eliott ซึ่งเป็น (ตามที่ฉันเข้าใจ) หนึ่งในผู้คิดค้นกระบวนทัศน์การเขียนโปรแกรมนี้ดูไม่ค่อยดี ฉันชอบรหัสของเขา แต่ฉันควรลองทางเลือกอื่นที่ทันสมัยกว่านี้ไหม อะไรคือความแตกต่างหลักระหว่างพวกเขาในแง่ของไวยากรณ์ / ประสิทธิภาพ / ความเสถียรของรันไทม์ หากต้องการอ้างอิงจากการสำรวจในปี 2554 …

8
ความเข้มงวดของ Haskell คืออะไร?
เราทุกคนรู้ (หรือควรรู้) ว่า Haskell ขี้เกียจไปโดยปริยาย ไม่มีสิ่งใดถูกประเมินจนกว่าจะต้องประเมิน ดังนั้นเมื่อต้องประเมินบางสิ่งบางอย่าง? มีจุดที่ต้องเข้มงวด Haskell ฉันเรียกสิ่งเหล่านี้ว่า "จุดเข้มงวด" แม้ว่าคำเฉพาะนี้จะไม่แพร่หลายอย่างที่คิด ตามฉัน: ลด (หรือการประเมินผล) ใน Haskell เพียงเกิดขึ้นในจุดที่เข้มงวด ดังนั้นคำถามคือสิ่งที่แม่นยำเป็น Haskell จุดเข้มงวด? สัญชาตญาณของฉันบอกว่าmain, seq/ รูปแบบปังจับคู่รูปแบบและใด ๆIOการดำเนินการดำเนินการผ่านทางmainเป็นประเด็นหลักเข้มงวด แต่ผมไม่ทราบจริงๆว่าทำไมฉันรู้ว่า (ถ้าไม่เรียกว่า "จุดเข้มงวด" จะเรียกว่าอะไร) ฉันคิดว่าคำตอบที่ดีจะรวมถึงการอภิปรายเกี่ยวกับ WHNF และอื่น ๆ ฉันยังคิดว่ามันอาจสัมผัสกับแคลคูลัสแลมบ์ดา แก้ไข: ความคิดเพิ่มเติมเกี่ยวกับคำถามนี้ ดังที่ฉันได้ไตร่ตรองเกี่ยวกับคำถามนี้แล้วฉันคิดว่าการเพิ่มคำจำกัดความของจุดเข้มงวดจะชัดเจนกว่า จุดเข้มงวดอาจมีบริบทที่แตกต่างกันและความลึกที่แตกต่างกัน(หรือความเข้มงวด) ย้อนกลับไปที่คำจำกัดความของฉันที่ว่า "การลดลงของ Haskell เกิดขึ้นที่จุดเข้มงวดเท่านั้น" ขอให้เราเพิ่มคำจำกัดความดังกล่าวในประโยคนี้: "จุดเข้มงวดจะเกิดขึ้นเมื่อมีการประเมินหรือลดบริบทโดยรอบเท่านั้น" ดังนั้นให้ฉันลองให้คุณเริ่มต้นด้วยคำตอบที่ฉันต้องการ mainเป็นจุดเข้มงวด ได้รับการกำหนดเป็นพิเศษให้เป็นจุดเข้มงวดหลักของบริบท: โปรแกรม เมื่อmainมีการประเมินบริบทของโปรแกรมจุดเข้มงวดของ main …

4
Haskell มีการเพิ่มประสิทธิภาพหางซ้ำหรือไม่?
วันนี้ฉันค้นพบคำสั่ง "time" ใน unix และคิดว่าจะใช้เพื่อตรวจสอบความแตกต่างของเวลาทำงานระหว่างฟังก์ชันการเรียกซ้ำแบบหางซ้ำและฟังก์ชันเรียกซ้ำแบบปกติใน Haskell ฉันเขียนฟังก์ชันต่อไปนี้: --tail recursive fac :: (Integral a) => a -> a fac x = fac' x 1 where fac' 1 y = y fac' x y = fac' (x-1) (x*y) --normal recursive facSlow :: (Integral a) => a -> a facSlow 1 = 1 …

4
ฉันจะใช้การแก้ไขได้อย่างไรและทำงานอย่างไร
ฉันสับสนเล็กน้อยกับเอกสารสำหรับfix(แม้ว่าฉันคิดว่าฉันเข้าใจว่ามันควรจะทำอะไรในตอนนี้) ดังนั้นฉันจึงดูซอร์สโค้ด นั่นทำให้ฉันสับสนมากขึ้น: fix :: (a -> a) -> a fix f = let x = f x in x สิ่งนี้ส่งคืนจุดคงที่ได้อย่างไร? ฉันตัดสินใจลองใช้ที่บรรทัดคำสั่ง: Prelude Data.Function> fix id ... และมันค้างอยู่ที่นั่น ตอนนี้เพื่อความเป็นธรรมนี่คือบน macbook เครื่องเก่าของฉันซึ่งค่อนข้างช้า อย่างไรก็ตามฟังก์ชั่นนี้ไม่สามารถคำนวณได้แพงเกินไปเนื่องจากสิ่งที่ส่งผ่านไปยัง id จะให้สิ่งเดียวกันนั้นกลับมา (ไม่ต้องพูดถึงว่ามันกินเวลา CPU ไม่ได้) ผมทำอะไรผิดหรือเปล่า?

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