สั้นที่สุด a -> b -> ฟังก์ชัน (a -> b) ใน Haskell


19

ฉันได้รับคำถามต่อไปนี้จากการทดสอบ:

เขียนฟังก์ชั่นที่มีประเภทดังต่อไปนี้f และไม่ควรผูกมัดในความหมายใด ๆ ยิ่งรหัสสั้นยิ่งดีa -> b -> (a -> b)ab

f a b = \x -> snd ([a,x],b)ฉันมาด้วย คุณสามารถหาบางอย่างที่สวยกว่า?

ปัจจุบันผู้ชนะคือ: f _=(.f).const


f = const constถ้าประเภททั่วไปมากขึ้นจะได้รับอนุญาต:
hammar

@hammar: หรือf _ b _ = bแต่เนื่องจากวิธีการแก้ปัญหาในคำถามฉันสงสัยว่าประเภททั่วไปไม่ได้รับอนุญาต
Tikhon Jelvis

6
หากอนุญาตให้ใช้ประเภททั่วไปได้มากกว่าทำไมf = idล่ะ
Tom Ellis

7
ในความเป็นจริงถ้าอนุญาตประเภททั่วไปมากกว่านั้นf = fเป็นวิธีแก้ปัญหาดังนั้นฉันเดาว่าเงื่อนไขในประเภทนั้นสำคัญมาก!
Tom Ellis

2
ไม่อนุญาตให้ใช้ประเภททั่วไปมากกว่านี้สมมติฐานของคุณถูกต้อง
Radu Stoenescu

คำตอบ:


11

ตัวอย่างของคุณสามารถหดได้โดยกำจัดฟังก์ชันที่ไม่ระบุชื่อทางด้านขวา:

f a b x = snd ([a,x],b)

วิธีนี้ใช้งานได้เนื่องจากชนิดa -> b -> a -> bนี้เทียบเท่ากับa -> b -> (a -> b)ใน Haskell


4
การปรับเปลี่ยนให้สั้นลงเล็กน้อย:f a b x = snd (f x,b)
Ed'ka

5

ฟังก์ชั่นf _=(.f).constที่เป็นจริงของประเภททั่วไปมากกว่าคือf :: a -> b -> (a -> b) f :: a -> b -> (c -> b)หากไม่มีการระบุประเภทลายเซ็นระบบการอนุมานประเภทจะเป็นประเภทหนึ่งf :: a -> b -> (a -> b)แต่ถ้าคุณรวมลายเซ็นประเภทf :: a -> b -> (c -> b)ที่มีคำจำกัดความเดียวกัน Haskell จะรวบรวมโดยไม่มีปัญหาและจะรายงานประเภทที่สอดคล้องกันสำหรับแอปพลิเคชันบางส่วนของ f อาจมีเหตุผลบางอย่างที่ทำให้ระบบอนุมานประเภทนั้นเข้มงวดกว่าระบบตรวจสอบประเภทในกรณีนี้ แต่ฉันไม่เข้าใจทฤษฎีหมวดหมู่มากพอที่จะอธิบายเหตุผลว่าทำไมจึงเป็นเช่นนี้ หากคุณไม่มั่นใจคุณสามารถลองด้วยตัวเองได้


f a b = f a aอาจจะเป็นเหมือนกรณีของ มันจะอนุมานเป็นชนิดแม้ว่ามันจะสอดคล้องกับประเภทa -> a -> b a -> b -> cมันเป็นเพราะหากfไม่ได้รับประเภทมันสามารถใช้ตัวเอง monomorphically
ภูมิใจ haskeller

ฉันไม่คิดว่ามันจะเป็นสิ่งสำคัญ
ภูมิใจ haskeller

4

ให้ScopedTypeVariablesฉันมากับสิ่งนี้:

f (_::a) b (_::a) = b

หากคุณหดทั้งฟังก์ชั่นของฉันและของคุณฉันจะสั้นลง:

f(_::a)b(_::a)=b
f a b x=snd([a,x],b)

แน่นอนคุณอาจไม่ได้รับอนุญาตให้พึ่งพาScopedTypeVariables: P


3
นี่ไม่สั้นเท่าf _=(.f).const( เนื่องจาก Sassa NF ) ScopedTypeVariablesซึ่งยังไม่จำเป็นต้อง
หยุดหมุนทวนเข็มนาฬิกาเมื่อ

อืมผมเริ่มคิดว่านี้จะต้องมีข้อโต้แย้งที่แรกและที่สามจะเป็นรายการ ...
คริสเทย์เลอร์

@ChrisTaylor: OCaml มากเกินไปในใจ? :)
Tikhon Jelvis

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