คำถามติดแท็ก functional-programming

ฟังก์ชั่นการเขียนโปรแกรมเป็นกระบวนทัศน์การเขียนโปรแกรมตามการสร้าง abstractions โดยใช้ฟังก์ชั่นหลีกเลี่ยงผลข้างเคียงและการเปลี่ยนแปลงของรัฐ การเขียนโปรแกรมใช้งานได้จริงนั้นปลอดภัยต่อเธรด

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 …

2
Haskell: Typeclass กับการส่งผ่านฟังก์ชัน
สำหรับฉันดูเหมือนว่าคุณสามารถส่งผ่านอาร์กิวเมนต์ของฟังก์ชันได้มากกว่าการใช้ typeclass ตัวอย่างเช่นแทนที่จะกำหนดประเภทความเสมอภาค: class Eq a where (==) :: a -> a -> Bool และใช้มันในฟังก์ชั่นอื่น ๆ เพื่อระบุอาร์กิวเมนต์ชนิดต้องเป็นตัวอย่างของEq: elem :: (Eq a) => a -> [a] -> Bool เราไม่สามารถกำหนดelemฟังก์ชั่นของเราโดยไม่ต้องใช้ตัวพิมพ์ดีดและส่งผ่านอาร์กิวเมนต์ฟังก์ชันที่ทำงานได้หรือไม่

2
มีความแตกต่างระหว่างลายเซ็นประเภท a -> b -> a และ c -> a -> c หรือไม่
คำถามนี้เป็นคำถามเชิงทฤษฎีเกี่ยวกับฟังก์ชั่นของ Haskell ซึ่งสามารถโต้แย้งได้ทุกประเภท มีความแตกต่างระหว่างวิธีการทำงานกับลายเซ็นประเภทของหรือไม่ a -> b -> a และ c -> a -> c มีการยกตัวอย่าง? ความช่วยเหลือใด ๆ ที่ชื่นชม

1
มีตัวแทนของ Van Laarhoven ของ `ตัวเลือก '
เลนส์หลายประเภทมีการแสดงของ van Laarhoven ตัวอย่างเช่นLensประเภทLens s t a b สามารถแสดงเป็น: Functor f => (a -> f b) -> s -> f t ในทำนองเดียวกันTraversalสามารถแสดงในลักษณะที่คล้ายกันสลับFunctorข้อ จำกัด สำหรับApplicative: Applicative f => (a -> f b) -> s -> f t กรอบเลนส์หลายประการเช่นMonocleและลูกศรOptionalกำหนดประเภทที่เรียกว่า ในการสืบทอดของ Monocle Optics นั้น Optionalเหมาะสมระหว่างLensและTraversal ตามที่ฉันเข้าใจแล้ว: หาก a Traversalเป็นเช่นLensนั้นอาจมีเป้าหมายเป็นศูนย์ถึงหลายเป้าหมายดังนั้นสิ่งนั้นOptionalก็เหมือนเช่นLensนั้นที่มีเป้าหมายเป็นศูนย์ถึงหนึ่งเป้าหมาย ใน Monocle Optionalหมายถึงคู่ของฟังก์ชั่น: getOrModify …

3
การใช้คำนี้ฟังก์ชั่นเป็นไปได้โดยไม่ต้องขั้นตอน postprocessing หลังจากพับหรือไม่?
Real World Haskell, ตอนที่ 4, หน้า 98 ของการพิมพ์ถามว่าwordsสามารถนำไปใช้โดยใช้ folds หรือไม่และนี่คือคำถามของฉันเช่นกัน: เป็นไปได้ไหม? ถ้าไม่ทำไม ถ้ามันเป็นอย่างไร ฉันคิดว่าสิ่งต่อไปนี้จะขึ้นอยู่กับความคิดที่ว่าแต่ละช่องว่างควรจะเติมคำสุดท้ายในรายการเอาท์พุท (นี้เกิดขึ้นในotherwiseยาม) และช่องว่างที่ควรจะเพิ่มคำ emtpy รายการเอาท์พุทหากยังไม่ได้มีอยู่ (มีการจัดการในif- then- else) myWords :: String -> [String] myWords = foldr step [[]] where step x yss@(y:ys) | x == ' ' = if y == "" then yss else "":yss | …

1
จะให้เหตุผลเกี่ยวกับความปลอดภัยของกองซ้อนใน Scala Cats / fs2 ได้อย่างไร
นี่คือชิ้นส่วนของรหัสจากเอกสารสำหรับFS2 ฟังก์ชั่นgoซ้ำ คำถามคือเราจะรู้ได้อย่างไรว่าปลอดภัยสำหรับสแต็กและวิธีการใช้ฟังก์ชันใดที่ปลอดภัยสแต็ก import fs2._ // import fs2._ def tk[F[_],O](n: Long): Pipe[F,O,O] = { def go(s: Stream[F,O], n: Long): Pull[F,O,Unit] = { s.pull.uncons.flatMap { case Some((hd,tl)) => hd.size match { case m if m <= n => Pull.output(hd) >> go(tl, n - m) case m => Pull.output(hd.take(n.toInt)) >> Pull.done } …

2
การล้างรายการข้อมูลใน Java8
สำหรับการล้างรายการข้อมูลฉันได้สร้างวิธีการที่ยอมรับรายการข้อมูลและรายการการดำเนินการล้างที่จะดำเนินการ public <T> List<T> cleanData(List<T> data, List<Function<T, T>> cleanOps) { List<T>dataNew=data.stream().map((str) -> { T cleanData = str; for(Function<T,T> function:cleanOps) { cleanData=function.apply(cleanData); } return cleanData; }).collect(Collectors.toList()); return dataNew; } ปัญหาที่นี่คือเรากำลังสร้างรายการทั้งหมดอีกครั้งเมื่อCollectors.toList()ส่งคืนรายการใหม่ เราสามารถบรรลุผลลัพธ์เดียวกันโดยไม่ต้องใช้พื้นที่เพิ่มเติมหรือไม่ ด้านล่างนี้เป็นรหัสสำหรับการร้องขอ: public void processData() { List<Function<String, String>> cleanOps = new ArrayList<>(); cleanOps.add(String::toLowerCase); cleanOps.add(str -> str.replaceAll(" ", "")); List<String> data = …

5
เหตุใด println จึงถือว่าเป็นฟังก์ชันที่ไม่บริสุทธิ์
ฉันกำลังอ่านการเขียนโปรแกรมหนังสือในรูปแบบสกาล่าและได้มีการกล่าวว่า: ... ในกรณีนี้ผลข้างเคียงของมันคือการพิมพ์ไปยังสตรีมเอาต์พุตมาตรฐาน และฉันไม่เห็นว่าผลข้างเคียงอยู่ที่ใดเพราะสำหรับอินพุตเดียวกัน println จะพิมพ์เอาต์พุตเดียวกัน (ฉันคิดว่า) อัปเดต ทุกครั้งที่เราเรียกว่า: println(5) มันจะพิมพ์5ฉันไม่เห็นกรณีที่การโทรprintln(5)จะพิมพ์ค่าอื่นที่ไม่ใช่ 5 !!

2
วิธีสร้าง JSDoc สำหรับฟังก์ชัน `pipe`d ES6
ฉันมีฟังก์ชั่น ES6 asyncPipeสไตล์ที่กำหนดไว้โดยใช้องค์ประกอบของฟังก์ชั่น import { getItemAsync } from 'expo-secure-store'; const asyncPipe = (...fns) => x => fns.reduce(async (y, f) => f(await y), x); const getToken = () => getItemAsync('token'); const liftedGetToken = async ({ ...rest }) => ({ token: await getToken(), ...rest, }); const liftedFetch = ({ body, route, token, …

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'] :: …

6
วิธีการทำซ้ำ getters / setters สำหรับคุณสมบัติสาธารณะใน POJO
เรามี POJO ที่สร้างขึ้นโดยอัตโนมัติด้วยคุณสมบัติ ~ 60 สิ่งนี้สร้างขึ้นด้วย avro 1.4 ซึ่งไม่รวม getters / setters ไลบรารีที่เราใช้เพื่อให้การแปลงอย่างง่ายระหว่างวัตถุต้องใช้วิธีเหมือน getter / setter เพื่อให้ทำงานได้อย่างถูกต้อง มีวิธีการทำซ้ำ getters / setters โดยไม่ต้องแทนที่ POJO ด้วยตนเองและสร้าง getters / setters ทั้งหมดด้วยตนเองหรือไม่ public class BigGeneratedPojo { public String firstField; public int secondField; ... public ComplexObject nthField; } public class OtherObject { private String reprOfFirstFieldFromOtherObject; …

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

2
ควรสร้างวัตถุ stateful ควรเป็นแบบจำลองชนิดของเอฟเฟกต์หรือไม่?
เมื่อใช้สภาพแวดล้อมที่ใช้งานได้เช่น Scala และcats-effectควรสร้างแบบจำลองวัตถุที่มีสภาวะเป็น state หรือไม่? // not a value/case class class Service(s: name) def withoutEffect(name: String): Service = new Service(name) def withEffect[F: Sync](name: String): F[Service] = F.delay { new Service(name) } การก่อสร้างไม่ได้ทำผิดได้ดังนั้นเราจึงสามารถใช้ typeclass Applyปรับตัวลดลงเช่น // never throws def withWeakEffect[F: Applicative](name: String): F[Service] = new Service(name).pure[F] ฉันเดาว่าทั้งหมดนี้บริสุทธิ์และไม่แน่นอน เพียง แต่ไม่อ้างอิงอย่างโปร่งใสเนื่องจากอินสแตนซ์ที่ได้นั้นแตกต่างกันในแต่ละครั้ง เป็นเวลาที่ดีในการใช้เอฟเฟกต์หรือไม่? หรือจะมีรูปแบบการทำงานที่แตกต่างกันที่นี่
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.