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

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

1
เมื่อค้นหาองค์ประกอบสุดท้าย แต่รายการที่สองทำไมจึงใช้ 'last` เร็วที่สุดในกลุ่มเหล่านี้
มี 3 ฟังก์ชั่นที่ระบุด้านล่างซึ่งค้นหาองค์ประกอบสุดท้าย แต่ที่สองในรายการ คนที่ใช้last . initดูเหมือนเร็วกว่าที่เหลือ ฉันดูเหมือนจะไม่เข้าใจว่าทำไม สำหรับการทดสอบฉันใช้รายการอินพุต[1..100000000](100 ล้าน) อันสุดท้ายวิ่งเกือบจะทันทีในขณะที่คนอื่นใช้เวลาหลายวินาที -- slow myButLast :: [a] -> a myButLast [x, y] = x myButLast (x : xs) = myButLast xs myButLast _ = error "List too short" -- decent myButLast' :: [a] -> a myButLast' = (!! 1) . reverse …
10 haskell 

3
ฉันจะใช้รายการความยาวขั้นต่ำคงที่ได้ทั้งหมดและสวยงามได้อย่างไร
ฉันกำลังจัดการกับฟังก์ชั่นที่จะเป็นดังนี้: foo = (\(a:b:c:d:e:f:_) -> foobar a b c d e f) . (++ repeat def) กล่าวอีกนัยหนึ่งเมื่อได้รับรายการจะใช้องค์ประกอบหกรายการแรกสำหรับบางสิ่งและหากรายการมีความยาวน้อยกว่าหกองค์ประกอบรายการนั้นจะใช้defเป็นรายการสแตนด์บายสำหรับรายการที่หายไป นี่คือทั้งหมด แต่ชิ้นส่วนของมันไม่ได้ (เหมือนmap fromJust . filter isJust) ดังนั้นฉันจึงไม่ชอบ ฉันพยายามเขียนใหม่เพื่อที่ว่ามันไม่จำเป็นต้องใช้ความลำเอียงและได้สิ่งนี้: foo [] = foobar def def def def def def foo [a] = foobar a def def def def def foo [a,b] = foobar …

4
ค้นหาว่าต้นไม้เป็นต้นไม้ค้นหาแบบทวิภาคใน Haskell หรือไม่
type BSTree a = BinaryTree a data BinaryTree a = Null | Node (BinaryTree a) a (BinaryTree a) deriving Show flattenTree :: BinaryTree a -> [a] flattenTree tree = case tree of Null -> [] Node left val right -> (flattenTree left) ++ [val] ++ (flattenTree right) isBSTree :: (Ord …

1
Haskells Weak Head ฟอร์มปกติ
ฉันสะดุดสิ่งที่น่ารำคาญบางอย่าง ฉันรู้ว่า Haskell ทำงานได้กับรูปแบบปกติของผู้อ่อนแอ (WHNF) และฉันรู้ว่านี่คืออะไร พิมพ์รหัสต่อไปนี้เป็น ghci (ฉันใช้คำสั่ง: sprint ซึ่งลดการแสดงออกของ WHNF ให้เป็นความรู้ของฉัน): let intlist = [[1,2],[2,3]] :sprint intlist ให้intlist = _ความรู้สึกแบบนี้กับฉันโดยสิ้นเชิง let stringlist = ["hi","there"] :sprint stringlist ให้stringlist = [_,_] สิ่งนี้ทำให้ฉันสับสนแล้ว แต่แล้ว: let charlist = [['h','i'], ['t','h','e','r','e']] :sprint charlist ให้อย่างแปลกใจ charlist = ["hi","there"] เท่าที่ผมเข้าใจ Haskell สตริงมีอะไรอย่างอื่นมากกว่ารายชื่อของตัวอักษรซึ่งดูเหมือนว่าจะได้รับการยืนยันโดยการตรวจสอบชนิดและ"hi" :: [Char]['h','i'] :: …

1
“ concatMap” จาก mono-traversable นั้นสามารถ“ ดึงออก” อาร์กิวเมนต์ทั่วไปได้อย่างไร
ฉันกำลังเรียนรู้ Haskell และกำลังทำโปรแกรมฐานข้อมูลอย่างง่ายสำหรับ Yesod เมื่อฉันสะดุดกับพฤติกรรมนี้ซึ่งฉันเข้าใจยาก testFn :: Int -> Bool -> [Int] testFn a b = if b then replicate 10 a else [] Yesod GHCI เซสชั่น: $ :t concatMap testFn [3] concatMap testFn [3] :: Bool -> [Int] $ (concatMap testFn [1,2,3]) True [1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3] อย่างใดก็สามารถ "ดึง" ออก "Bool" ที่สองจากการแมปแต่ละครั้งเป็นอาร์กิวเมนต์ …

5
ฉันจะทำให้อัลกอริธึมนี้ดีกว่าโดยไม่ต้องทำซ้ำตัวเองได้อย่างไร
(ได้แรงบันดาลใจจากคำตอบของคำถามนี้ ) พิจารณารหัสนี้ (มันควรจะหาองค์ประกอบที่ใหญ่ที่สุดที่น้อยกว่าหรือเท่ากับอินพุตที่กำหนด): data TreeMap v = Leaf | Node Integer v (TreeMap v) (TreeMap v) deriving (Show, Read, Eq, Ord) closestLess :: Integer -> TreeMap v -> Maybe (Integer, v) closestLess i = precise Nothing where precise :: Maybe (Integer, v) -> TreeMap v -> Maybe (Integer, v) …

2
รัฐต่างๆใน Haskell
ฉันกำลังพยายามกำหนดตระกูลของเครื่องสถานะที่มีสถานะแตกต่างกันบ้าง โดยเฉพาะอย่างยิ่งยิ่งเครื่องจักรซับซ้อน "รัฐ" มีสถานะที่เกิดขึ้นจากการรวมรัฐของเครื่องจักรรัฐง่ายขึ้น (สิ่งนี้คล้ายกับการตั้งค่าวัตถุที่วัตถุมีหลายคุณลักษณะที่เป็นวัตถุด้วย) นี่คือตัวอย่างที่เรียบง่ายของสิ่งที่ฉันต้องการบรรลุ data InnerState = MkInnerState { _innerVal :: Int } data OuterState = MkOuterState { _outerTrigger :: Bool, _inner :: InnerState } innerStateFoo :: Monad m => StateT InnerState m Int innerStateFoo = do i <- _innerVal <$> get put $ MkInnerState (i + 1) …

2
ผลรวมประเภท - ทำไมใน Haskell จึงเป็น `show (Int | Double)` ต่างจาก `(show Int) | (แสดงสองครั้ง) `
ทำไมสิ่งเหล่านี้จึงไม่เทียบเท่ากัน show $ if someCondition then someInt else some double และ if someCondition then show someInt else show someDouble ฉันเข้าใจว่าถ้าคุณแยกif ... elseส่วนในตัวอย่างแรกให้กับนิพจน์ด้วยตัวเองคุณจะไม่สามารถแสดงประเภทของมันด้วยประเภทผลรวมนิรนามชนิดของInt | Doubleสิ่งที่คุณสามารถทำได้อย่างง่ายดายใน TypeScript (กล่าวถึง TypeScript เพราะมันเป็น langauge ผมใช้บ่อยและประเภทสนับสนุนซำ) และจะต้องหันไปใช้ข้อมูลนั้นขึ้นอยู่กับว่ามันจะเรียกEithershow ตัวอย่างที่ฉันให้ที่นี่มีความสำคัญ แต่สำหรับฉันมันสมเหตุสมผลมากกว่าที่จะคิดว่า "โอเคเรากำลังจะแสดงบางสิ่งบางอย่างและสิ่งนั้นขึ้นอยู่กับsomeCondition" มากกว่า "โอเคถ้ามีเงื่อนไขจริงแล้วแสดงบางอย่าง สำหรับการทำซ้ำรหัสน้อย (ที่นี่แสดงซ้ำสองครั้ง แต่มันอาจจะเป็นฟังก์ชั่นการใช้งานที่ยาวนานและแทนที่จะif ... elseมี> 2 สาขาที่ต้องพิจารณา) ในใจของฉันมันควรจะง่ายสำหรับคอมไพเลอร์เพื่อตรวจสอบว่าแต่ละประเภทที่ทำให้ผลรวมประเภท (ที่นี่Int | Double) สามารถใช้เป็นพารามิเตอร์ในการshowทำงานและตัดสินใจว่าประเภทถูกต้องหรือไม่ ยิ่งไปกว่านั้นshowฟังก์ชั่นนั้นจะส่งคืนstringชนิดพารามิเตอร์เสมอดังนั้นคอมไพเลอร์ไม่จำเป็นต้องดำเนินการกับ "สาขา" …

1
ฉันจะทำอย่างไรกับ callCC ที่ไม่สามารถดำเนินการต่อได้
ฉันกำลังต่อสู้กับความเข้าใจ callCC จริงๆ ฉันได้รับพลังแห่งการสานต่อและฉันใช้แนวคิดนี้ในบางโครงการของฉันเพื่อสร้างแนวคิดเจ๋ง ๆ cont :: ((a->r)->r)-> Cont r aแต่ไม่เคยมีฉันต้องการที่จะใช้สิ่งที่มีความสามารถมากกว่า หลังจากใช้แล้วมันสมเหตุสมผลมากว่าทำไมพวกเขาถึงเรียก Cont Cont ว่าเป็นแม่ของ monads ทั้งหมดใช่เลยฉันไม่เข้าใจว่าจะต้องใช้เมื่อไรcallCCและนั่นคือคำถามของฉัน

1
วิธีควบคุมความแปรปรวนของสเกล
ฉันพยายามที่จะรวมไดอะแกรมหลายอย่างเข้าด้วยกันในตาราง ฉันคิดว่าสิ่งนี้เรียกว่า"ดัชนีการพิมพ์"คนถ่ายภาพทำอย่างนั้นเมื่อพวกเขาต้องทบทวนภาพถ่ายจำนวนมากในครั้งเดียว อย่างไรก็ตามนี่คือรหัส: main :: IO () main = mainWith @(Diagram B) $ (tile . fmap renderOne) examples renderOne :: AnyGraph -> Diagram B renderOne (AnyGraph gr) = ... tile :: [Diagram B] -> Diagram B tile xs = let columns = (ceiling . sqrt . fromIntegral . length) xs …

3
จำเป็นต้องมีความรู้หรือการฝึกอบรมประเภทใดสำหรับคนที่จะเขียนคำจำกัดความของ foldlM แบบนี้ [ปิด]
ปิด คำถามนี้จะต้องมีมากขึ้นมุ่งเน้น ไม่ยอมรับคำตอบในขณะนี้ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามเพื่อให้มุ่งเน้นที่ปัญหาเดียวโดยแก้ไขโพสต์นี้ ปิดให้บริการใน7 เดือนที่ผ่านมา เมื่อเร็ว ๆ นี้ฉันพยายามใช้ Haskell ในระบบการผลิตกรณีจริงของฉัน ระบบประเภท Haskell ให้ความช่วยเหลือฉันอย่างมาก ตัวอย่างเช่นเมื่อฉันรู้ว่าฉันต้องการฟังก์ชั่นบางประเภท f :: (Foldable t, Monad m) => ( a-> b -> m b) -> b -> t a -> m b มีจริงการทำงานเช่นfoldM, และfoldlMfoldrM อย่างไรก็ตามสิ่งที่น่าตกใจจริง ๆ คือนิยามของฟังก์ชั่นเหล่านี้เช่น: foldlM :: (Foldable t, Monad m) => (b …

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 อย่างไรก็ตามแนวคิดการเขียนโปรแกรมเชิงวัตถุบางอย่าง (การสืบทอดง่าย …

3
ตู้คอนเทนเนอร์ขนาดคงที่ทั้งหมดนั้นเป็นฟังก์ชั่นโมโนเรดที่แข็งแกร่งหรือไม่
Applicativetypeclass หมายถึงหละหลวม monoidal functors ที่รักษาโครงสร้าง monoidal คาร์ทีเซียนในหมวดหมู่ของฟังก์ชั่นพิมพ์ กล่าวอีกนัยหนึ่งได้รับ isomorphisms บัญญัติซึ่ง(,)เป็นรูปแบบโครงสร้าง monoidal: -- Implementations left to the motivated reader assoc_fwd :: ((a, b), c) -> (a, (b, c)) assoc_bwd :: (a, (b, c)) -> ((a, b), c) lunit_fwd :: ((), a) -> a lunit_bwd :: a -> ((), a) runit_fwd :: …

1
Parallel“ any” หรือ“ all” ใน Haskell
รูปแบบที่ฉันเจอหลายครั้งตอนนี้เป็นสิ่งที่รายการค่าต้องตรวจสอบโดยการทำแผนที่การทดสอบบางอย่างและดูว่าองค์ประกอบใด ๆ หรือทั้งหมดผ่าน การแก้ปัญหาโดยทั่วไปเป็นเพียงการใช้งานที่สะดวก built-ins และallany ปัญหาคือสิ่งเหล่านี้ประเมินในอนุกรม ในหลายกรณีมันจะมากได้เร็วขึ้นในการประเมินในแบบคู่ขนานกับกระบวนการเป็นครั้งเดียวที่สมบูรณ์ใด ๆด้ายพบ "เท็จ" สำหรับallหรือ "ทรู" anyสำหรับ ฉันค่อนข้างแน่ใจว่าพฤติกรรมการลัดวงจรไม่สามารถใช้งานได้โดยใช้ Control.Parallel เนื่องจากต้องใช้การสื่อสารระหว่างกระบวนการและฉันยังไม่เข้าใจที่ใดก็ตามที่อยู่ใกล้ Control.Concurrent พอที่จะใช้งานได้ มันเป็นรูปแบบที่ค่อนข้างธรรมดาในวิชาคณิตศาสตร์ (เช่น Miller-Rabin Primality) ดังนั้นฉันรู้สึกว่ามีบางคนอาจคิดหาวิธีแก้ปัญหานี้อยู่แล้ว แต่ด้วยเหตุผลที่ชัดเจนในการค้นหา google สำหรับ "ขนานหรือ / และ / ใด ๆ / ทั้งหมดในรายการ Haskell "ไม่แสดงผลลัพธ์ที่เกี่ยวข้องหลายรายการ
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.