เรามีจำนวนเต็มจำนวนจุดลอยตัวสตริงและชนิดทศนิยมที่เห็นเป็นครั้งคราวทั้งหมด ประเภทที่แปลกประหลาดหรือมีประโยชน์ที่สุดที่คุณพบมีประโยชน์หรือไม่?
เรามีจำนวนเต็มจำนวนจุดลอยตัวสตริงและชนิดทศนิยมที่เห็นเป็นครั้งคราวทั้งหมด ประเภทที่แปลกประหลาดหรือมีประโยชน์ที่สุดที่คุณพบมีประโยชน์หรือไม่?
คำตอบ:
ฉันจะสั้น:
Maybe a
ใน Haskell
ด้วยโครงสร้างที่เรียบง่ายนี้ภาษาจะช่วยแก้ปัญหาการขัดข้องหรือNullPointerException
อย่างเลี่ยงไม่ได้ที่ "One Million Mistake" ของ Tony Hoare :)
ตรงไปตรงมาการมีตัวเลือกตรวจสอบเวลารวบรวม? มันเหมือนฝัน ...
Option
ชื่อ ทำไมไม่Optional
! อาจเป็นเพราะฉันไม่ใช่เจ้าของภาษา แต่Option
ไม่ได้สื่อความหมายถึง "ทางเลือก" ให้ฉัน
Maybe
ชื่อน่ารัก: "คุณมีอะไร?" "อาจเป็น Int" อย่างไรก็ตามสิ่งที่ประณีตมาก ๆ ก็คือมันเป็นทั้งนักแสดงและโมนาดที่พูดง่าย ๆ หมายความว่าคุณจะได้รับการปลดปล่อยว่างเปล่า คุณไม่จำเป็นต้องใส่เช็คว่างในฟังก์ชั่นหรือกลางรหัสของคุณ คุณเพียงแค่ต้องตรวจสอบที่ส่วนท้ายสุดของรหัสของคุณถ้าทั้งหมด
Maybe
monad สำหรับ Ruby: lostechies.com/derickbailey/2010/10/10/the-maybe-monad-in-ruby
void *
ฉันรักเสมอ มันอาจเป็นอาการของบางสิ่งบางอย่างในตัวฉัน
void *
และปาสกาล / Delphi Pointer
มี
ลัวะมีโต๊ะในตัวที่น่าประทับใจที่สุด มันมี hashtable ในตัวและเวกเตอร์และด้วยการใช้metatablesสามารถเป็นฐานพื้นฐานสำหรับการเขียนโปรแกรมเชิงวัตถุในภาษาขั้นตอน
แต่ละดัชนีของตารางสามารถรับโครงสร้างภาษาพื้นฐานใด ๆ (ตัวเลข, บูลีน, สตริง, ฟังก์ชัน -yes, ฟังก์ชั่นเป็นประเภทบน lua - และตาราง)
ฉันประหลาดใจที่ไม่มีใครพูดถึง Monads หรือ Algebraic Datatypes เลย
ชัดมีสองประเภทที่น่าสนใจ: และt
nil
สิ่งที่น่าสนใจเกี่ยวกับพวกเขาคือทุกอย่างเป็นและไม่มีอะไรที่เป็นt
nil
nil
t
SNOBOL: pattern (ส่วนใหญ่เป็นตัวแยกวิเคราะห์ต้นไม้ LL (1) ถ้าฉันจำได้ถูกต้อง)
Fortran มีบล็อคทั่วไป เป็นหนึ่งในประเภทข้อมูลที่พบได้น้อยที่สุดในภาษาสมัยใหม่หรือเป็นวิธีที่ผิดปกติในการแบ่งปันข้อมูลได้อย่างมีประสิทธิภาพ
Fortran 95 มีประเภทของช่วงเวลาและ arithmetics ช่วงเวลาในตัว
รายการจะไม่สมบูรณ์หากไม่มีประเภท monadic ที่พบใน Haskell เพื่อให้เข้าใจพวกเขาคุณต้องใช้ความพยายาม
Delphi ได้ตั้งค่า ( ดูเพิ่มเติม ) ซึ่งฉันไม่เชื่อว่าจะดำเนินการในลักษณะเดียวกันในภาษาอื่น ๆ
สิ่งนี้ทำให้การจัดเก็บแอตทริบิวต์หลายตัวแปรในฐานข้อมูลเป็นเรื่องง่าย: D
ฉันคิดว่ามันจริงๆเพียงแปลกมาจากการเขียนโปรแกรมบนสถาปัตยกรรมคลาสสิก แต่แน่นอนหนึ่งในประเภทที่ยากที่สุดสำหรับผมที่จะตัดหัวของฉันรอบที่เป็นครั้งแรกที่ลงทะเบียนควอนตัมซึ่งแสดงให้เห็นว่าในQCL
PL / SQL ช่วยให้คุณประกาศตัวแปรประเภทmy_table.some_column%type
... ฉันพบว่ามีประโยชน์มาก
และ C # ช่วยให้คุณประกาศวัตถุเป็นโมฆะหรือไม่แม้ว่าฉันไม่แน่ใจว่านับเป็นประเภท
cursor%rowtype
มันก็สนุกกว่า: มันเป็นรูปแบบบันทึกที่สร้างขึ้นแบบไดนามิกซึ่งสะท้อนถึงคอลัมน์ที่แบบสอบถามของเคอร์เซอร์ส่งกลับ
ฉันมีจุดอ่อนอยู่ในใจสำหรับประเภทข้อมูลของEuphoriaเมื่อฉันยังเด็ก
มันมีโครงสร้างดังนี้:
Object
-> Atom
-> Sequence
Sequence = ลำดับของวัตถุ
-- examples of atoms:
0
98.6
-1e6
-- examples of sequences:
{2, 3, 5, 7, 11, 13, 17, 19}
{1, 2, {3, 3, 3}, 4, {5, {6}}}
{{"jon", "smith"}, 52389, 97.25}
{} -- the 0-element sequence
ดู: คู่มืออ้างอิง
หมายเหตุ: "jon" เป็นวิธีสั้น ๆ ในการเขียนลำดับของค่า ASCII ตัวอย่างเช่น"ABCDEFG"
เดียวกับ{65, 66, 67, 68, 69, 70, 71}
เฟลิกซ์มีประเภทผลรวมที่ไม่ระบุชื่อ ประเภทเขียนเช่น:
typedef il = int + long;
ในทางทฤษฎี ค่านั้นน่าเกลียด:
case 0 of il (1)
case 1 of il (2L)
ยกเว้นบางทีสำหรับผลรวมหน่วยเช่น 3 = 1 + 1 + 1
case 0 of 3
case 1 of 3
ซึ่งโชคไม่ดีที่ใช้การนับต้นกำเนิดเป็นศูนย์สำหรับ "ความเข้ากันได้ของ C" จำนวนนิรนามที่จำเป็นสำหรับประเภทพีชคณิตที่พิมพ์ด้วยโครงสร้างเช่น:
(1 + T * li) as li
เป็นรายการ (ลิงก์ที่เชื่อมโยงโดยลำพัง) ของ T ทุกภาษาอื่น ๆ ที่ฉันรู้ว่าต้องใช้จำนวนเงินที่พิมพ์ในนามซึ่งทั้งชนิดของตัวเองและตัวสร้างจะต้องได้รับชื่อ
ชวเลข 3 ที่ใช้ด้านบนน่ารักต่อไปนี้อยู่ในห้องสมุด:
typedef void = 0;
typedef unit = 1;
typedef bool = 2;
และสัญลักษณ์นี้:
T ^ 3
คืออาร์เรย์ของความยาวคงที่ 3 .. 3 ไม่ใช่จำนวนเต็ม แต่รวมเป็น 3 หน่วย น่าเสียดาย + ไม่ได้เชื่อมโยงกัน :)
q / kdb +มีตารางในตัว เนื่องจากเป็นภาษาโปรแกรมและฐานข้อมูลแบบคอลัมน์ดังนั้นจึงไม่จำเป็นต้องใช้ LINQ หรือ ORM
ตัวอย่างเช่นสามารถสร้างตารางเช่นนี้ (การมอบหมายถูกบิดเบือนโดย:
แทนที่จะ=
เป็นในภาษาส่วนใหญ่):
people:([]name:`Joe`Amy`Sarah; age:17 15 18; GPA:3.5 3.8 3.33)
ตอนนี้ฉันสามารถดูตารางของฉัน:
q)show people
name age GPA
--------------
Joe 17 3.5
Amy 15 3.8
Sarah 18 3.33
และฉันสามารถค้นหาได้:
q)select from people where GPA>3.4
name age GPA
------------
Joe 17 3.5
Amy 15 3.8
ฉันพบว่าสหภาพใน C ++ เป็น 'แปลก' เมื่อฉันได้ยินเกี่ยวกับพวกเขาครั้งแรก ฉันยังไม่ได้ตีฉากที่พวกเขาเป็นตัวเลือกที่ชัดเจนในการใช้งาน
ฉันยังคงพยายามที่จะสรุปสิ่งที่ฟังก์ชั่นหลายพารามิเตอร์กลายเป็น F # และภาษาที่ใช้งานได้อื่น ๆ โดยทั่วไป f (Foo, Bar) กลายเป็น func f (Foo)
นั่นคือฟังก์ชั่นพารามิเตอร์สองตัวที่รับ Foo และ Bar และคืนค่า int เป็นฟังก์ชั่นพารามิเตอร์หนึ่งตัวที่รับ Foo และส่งกลับฟังก์ชั่นพารามิเตอร์หนึ่งที่ใช้บาร์และคืนค่า int แต่อย่างใดคุณสามารถเรียกมันด้วยสองพารามิเตอร์ถ้าคุณต้องการ ฉันเขียนโพสต์เกี่ยวกับที่นี่
f(Foo, Bar)
จะเหมือนกับฟังก์ชั่นf(Foo)
ที่คืนค่าฟังก์ชั่นอื่นf'(Bar)
ซึ่งคืนค่าที่f(Foo, Bar)
จะคืน นั่นคือถ้าคุณแก้ไขอาร์กิวเมนต์ 'Foo' แต่ไม่ใช่ 'Bar' คุณจะมีฟังก์ชันที่ไม่ได้ขึ้นอยู่กับ 'Foo' แต่ยังขึ้นอยู่กับอาร์กิวเมนต์ 'Bar' นี่เป็นเรื่องปกติสำหรับภาษาที่ใช้งานได้ มันเรียกว่า 'แกง'
พวกมันเป็นวัตถุที่ทรงพลัง แต่กระทัดรัด
ภาษาที่พวกเขาสร้างขึ้นมีความสามารถในการจัดการข้อความได้ดีเยี่ยม
ภาษาหนึ่งภาษาในตระกูลที่ใช้งานได้มีคลาสที่เรียกว่า Unity คุณลักษณะที่แตกต่างของประเภท Unity คือไม่มีข้อมูล แต่เป็นประเภทบิตบิต ประเภทความสามัคคี (ในบางรูปแบบ) เป็นเพียงค่าเดียวหรือ (ในส่วนใหญ่) มีเพียงค่าเดียวเท่านั้น (ซึ่งไม่ใช่ประเภทเอง)
สิ่งเหล่านี้มีประโยชน์เนื่องจากเป็นประเภทที่แตกต่าง เนื่องจากคุณไม่สามารถแปลงจากประเภทเอกภาพหนึ่งไปเป็นอีกประเภทหนึ่งได้โดยปริยายคุณสามารถวางการตรวจสอบประเภทแบบสแตติกให้ทำงานได้อย่างมีประสิทธิภาพและรวดเร็ว
ความสามัคคียังเป็นวิธีที่ภาษาส่วนใหญ่อธิบาย Enums ด้วยการอนุญาตให้ชนิดใหม่เป็นชุดใด ๆ ที่กำหนดประเภทอื่น ๆ หรือเพื่ออธิบายประเภทบางทีค่าที่อาจเป็นค่าของประเภททั่วไป (พูดจำนวนเต็ม) หรือมีค่าที่แสดงถึงไม่มีค่า
บางภาษาที่ไม่ได้ใช้ประเภทของความสามัคคีที่ผู้ใช้กำหนดยังคงมีความเป็นเอกภาพในบางรูปแบบหรืออย่างอื่น ยกตัวอย่างเช่นงูหลามมีอย่างน้อยสามประเภทความสามัคคีNoneType
, และNotImplementedType
EllipsisType
เป็นที่น่าสนใจว่าสองคนแรกทั้งสองหมายถึงบางสิ่งบางอย่างเช่น "ไม่มีค่า" แต่ที่สองใช้ในค่าที่ซับซ้อน (โดยเฉพาะการแสดงออกชิ้น) เพื่อเป็นตัวแทนกรณีพิเศษที่น่าสนใจ
ตัวอย่างที่น่าสนใจอื่น ๆ ของความสามัคคีรวมNULL
อยู่ใน sql และundefined
ใน javascript แต่ไม่ใช่void
ใน C หรือ C ++ void
ล้มเหลว แม้ว่ามันจะอธิบายคุณค่าของการไม่มีข้อมูล void
แต่ไม่คุ้มค่าที่เกิดขึ้นจริงสามารถเป็นชนิด
symbol
ประเภทของรูบี้นั้นผิดปกติเล็กน้อย มันเป็นสตริงที่ใช้รูปแบบซิงเกิล หรือบางสิ่งบางอย่าง. จนถึงตอนนี้ฉันพบว่าการใช้สัญลักษณ์ที่ดีที่สุดอยู่ในสถานะการติดตามและการส่งผ่านชื่อฟังก์ชัน
ภาษาโคบอล โดยพื้นฐานแล้วมีเพียงสองประเภทข้อมูลพื้นฐานสตริงและตัวเลข แต่คุณต้องระบุอย่างชัดเจนว่าพวกมันถูกวางในหน่วยความจำPIC S9(5)V99 COMP-3
อย่างไร
S
= เซ็นชื่อ, 9(5)
= 5 หลัก, V
= จุดทศนิยมโดยนัย99
= อีก 2 หลักCOMP-3
= BCD + เครื่องหมาย nybble
Clipper มี 'Code Blocks' ซึ่งคล้ายกับวิธีที่ไม่ระบุชื่อ พวกเขาสามารถส่งผ่านไปและประเมินตามความจำเป็นมักจะเป็นรูปแบบของการโทรกลับ คุณมักจะใช้มันสำหรับสิ่งต่าง ๆ เช่นทำการคำนวณแบบทันทีเมื่อแสดงตารางข้อมูล
VHDL มีประเภททางกายภาพ ตัวอักษรประเภทดังกล่าวรวมถึงทั้งค่าและหน่วย คุณสามารถกำหนดหน่วยย่อยได้เช่นกัน ตัวอย่างเช่นประเภททางกายภาพที่กำหนดไว้ล่วงหน้าคือtime
:
type time is range <machine dependant> to <machine dependant>
units
fs;
ps = 1000 fs;
ns = 1000 ps;
us = 1000 ns;
Ms = 1000 us;
sec = 1000 ms;
min = 60 sec;
hr = 60 min;
end units;
คุณสามารถกำหนดสิ่งต่าง ๆ ที่น่าสนใจได้
Clojure นั้นน่าสนใจเพราะมันมี meta-concept ของ "abstractions" ที่แพร่หลายภาษา ตัวอย่าง:
ในระดับหนึ่ง abstractions ใช้ " ความรับผิดชอบหลักการเดียว " ไปมาก มันขึ้นอยู่กับคุณที่จะแต่งมันเพื่อให้ได้ฟังก์ชั่นที่คุณต้องการ แต่คุณสามารถยืดหยุ่นได้อย่างมากเกี่ยวกับวิธีการรวมเข้าด้วยกัน
ตัวอย่างเช่นถ้าคุณต้องการระบบ OOP แบบคลาสที่มีการสืบทอดคุณสามารถสร้างหนึ่งในนามธรรมหลักเหล่านี้ได้อย่างรวดเร็ว
ในทางปฏิบัติ abstractions ของตัวเองได้รับการออกแบบในลักษณะที่การใช้งานที่เป็นไปได้หลายอย่างเช่นผ่านทางอินเตอร์เฟสที่เฉพาะเจาะจงเช่น clojure.lang.ISeq สำหรับลำดับหรือ clojure.lang.IFn สำหรับฟังก์ชันลำดับที่สูงขึ้น
มีวิดีโอที่น่าสนใจเกี่ยวกับหัวข้อนี้: The Art of Abstraction
Googles Go มีประเภท "Channel" ซึ่งค่อนข้างแปลก