프로그래밍 언어에서 흥미 롭거나 독특한 유형? [닫은]


20

우리는 모두 정수, 부동 소수점, 문자열 및 간헐적 10 진수 유형을 보았습니다. 가장 이상하거나 독특하거나 유용한 유형 중 유용하거나 그렇지 않은 유형은 무엇입니까?


안녕하세요 user10008, Programmers.SE에 오신 것을 환영합니다! FAQ 를 확인 하셨습니까? 6 가지 주관적인 지침 중 어느 것이 귀하의 질문에 부합한다고 생각하십니까?

4
누구든지 Lisp에 대한 글을 쓰시겠습니까?
Mark C

나는 그것이 속이는 줄 알았지 만 내 대답이 속이었기 때문에 만 링크를 게시하고 좋은 답변을 찾을 수 있습니다 : programmers.stackexchange.com/questions/724/…
Peter Turner

@ Mark : 시도했지만 Lisp에 대해 가장 흥미로운 유형 중 하나 일 것입니다.
Larry Coleman

@LarryC 나는 목록이 널리 보급되어 있기 때문에 이것이 Lisp에 대한 완벽한 질문이라고 생각했습니다 ! 목록은 구문 트리를 형성하며 코드에 놀라운 일을하는 함수를 작성할 수 있습니다. 나는 지금 Racket (이전 PLT Scheme )을 배우고 있습니다. Lisp는 제가 진정으로 배우고 배우고 자하는 유일한 프로그래밍 언어입니다.
Mark C

답변:


18

나는 짧을 것이다 :

Maybe a

하스켈에서.

이 간단한 구성으로 언어는 충돌 문제를 해결하거나 NullPointerExceptionTony Hoare의 "백만 백만 실수"를 깔끔하게 회피합니다. :)

솔직히, 선택적 존재는 컴파일 타임에 확인 되었습니까? 꿈처럼 ...


1
또는 다른 많은 프로그래밍 언어에서 호출되는 Option .
Jonas

@Jonas : Option이름이 마음에 들지 않는다는 것을 인정해야합니다 . 왜 안돼 Optional! 나는 원어민이 아니기 때문에 Option"선택적"이라는 의미를 전달하지 않습니다.
Matthieu M.

Maybe이름은 귀엽다 "당신은 무엇을해야합니까?" "아마도 Int"입니다. 그러나 정말 깔끔한 점은 그것이 functor와 monad라는 것입니다. 일반적으로 말하면 무료로 널 전파를 의미합니다. 함수 내부 또는 코드 중간에 null 검사를 넣을 필요가 없습니다. 코드의 맨 끝에서만 확인하면됩니다.
Tikhon Jelvis

Maybe루비를 위한 모나드 가 있습니다 : lostechies.com/derickbailey/2010/10/10/the-maybe-monad-in-ruby
Jason Lewis

15

나는 매년 좋아 void *합니다. 아마도 나에게 깊은 결함이있는 증상 일 것이다.


2
예. 나는 그것이 정확히 무엇인지 두려워합니다. :) 아, "고유 한"보다는 "흥미로운"에 +1. Objective-C에는 분명히 void *있고 Pascal / Delphi에는 있습니다 Pointer.
Frank Shearar

하하 더 비 유형의,하지만 당신은 그것이 강력하지 않다 주장 할 수 없습니다
user10008

15
나는 그것이 표현하는 고유 한 비관론을 좋아합니다. '저기 저것을 볼 수 있습니까?' ‘예, 무엇입니까?’,‘모릅니다.’
biziclop

나는 항상 당신이 공허를 선언 할 수 없다는 것이 재미 있다고 생각했지만 그 주소를 취할 수 있습니다. struct s {int A; 보이드 B; int C; } B의 주소는 A와 C 사이의 균열 주소 여야한다. 그러나 허용되지는 않는다.
Andy Canfield

이것이 파스칼에서 "포인터"가 일반 포인터를 나타 내기 위해 사용되고 "프로 시저"와 혼동하지 않는 이유입니다.
umlcat

14

루아에는 가장 인상적인 내장 테이블 이 있습니다. 해시 테이블과 벡터가 내장되어 있으며 메타 테이블을 사용 하면 절차 언어에서 객체 지향 프로그래밍의 기본 기반이 될 수 있습니다.

테이블의 각 인덱스는 기본 언어 구조 (숫자, 부울, 문자열, 함수 -yes, 함수는 루아-및 테이블)를받을 수 있습니다.


Javascript가 매우 유사한 방식으로 구축되고 Python이 Ruby와 마찬가지로 동일한 기반으로 구축되는 방법에 유의하십시오.
9000

나는 이것이 Perl과 PHP에서도 가능하다고 생각합니다.
FrustratedWithFormsDesigner 5

루아의 테이블과 다른 언어의 해시 컨테이너에는 차이가 있습니다. 루아가 해시 값을 배포하는 방식에는 미묘한 구현 차이가 있으므로 테이블이 거의 마술처럼 작동합니다. 나는 주로 파이썬으로 프로그래밍하고 때로는 루아에서 테이블이 작동하는 방식에 대한 기대에 근거하여 가정하지 않은 가정을 사용하고 있음을 알게됩니다. 이 마법의 구체적인 예는 정수 키 densly 포장되어 자신 + 1이 수단이 정수 해시이며, 0.0 및 -0.0 같은 해시 (그들은 동일) 가지고
SingleNegationElimination

9

아무도 Monads 또는 Algebraic Datatypes를 언급하지 않은 것에 놀랐습니다.


우리에게 예제를 보여줄 수 있습니다 :)
nawfal

8

리스프는 두 개의 흥미로운 유형을 가지고 tnil. 그들에 대해 흥미로운 것은 모든 것이 a t이며 아무것도 없다는 것입니다 nil.


진심 이세요? 난 몰랐어.
Mark C

nila는 t?
Jon Harrop 2019


6

포트란에는 공통 블록이 있습니다. 현대 언어에서 가장 일반적인 데이터 형식 중 하나이거나 데이터를 효율적으로 공유하는 특이한 방법입니다.

포트란 95에는 인터벌 유형 과 내장 인터벌 산술이 있습니다.

이 목록은 Haskell에서 모나 딕 유형 이 없으면 완전하지 않습니다 . 그것들을 이해하려면 약간의 노력이 필요합니다.


아, UniData / UniVerse DB에는 내부 언어 (UniBasic)의 공통 블록도 있습니다.
Dan McGrath

공통 블록은 프로그램의 다른 부분에서 사용되는 코드 블록입니까?
Mark C

1
@MarkC IIRC는 기본적으로 글로벌 데이터 만 명시 적으로 상단에 가고 말해야하는 액세스하는 각 기능
JK합니다.

5

델파이는이 세트 ( 참조 나는 다른 언어로 같은 방식으로 구현 생각하지 않는다).

이로 인해 데이터베이스에 다중 변수 속성을 쉽게 저장할 수 있습니다.


4

나는 그것이 고전 건축에 프로그래밍에서 오는 정말에만 이상하다 생각하지만, 확실히 내 주위에 처음에 내 머리를 감싸는이었다하기 위해 가장 어려운 유형 중 하나를 양자 레지스터 에서, 쇼까지 QCL .


3

PL / SQL을 사용하면 유형의 변수를 선언 할 수 있습니다 my_table.some_column%type... 매우 유용합니다.

그리고 C #을 사용하면 객체를 nullable로 선언 할 수 있지만 유형으로 계산되는지 확실하지 않습니다.


4
그러나 cursor%rowtype더욱 재밌습니다. 커서 쿼리가 반환하는 열을 반영하는 동적으로 구성된 레코드 유형입니다.
9000

.NET "Nullable"은 실제로는 제네릭 형식입니다.
Konamiman

3

내가 어렸을 때 행복감 의 데이터 유형에 대해 마음에 부드러운 자리를 가졌습니다.

다음과 같이 구성됩니다.

Object
-> Atom
-> 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}


7
이것은 LISP와 같은 느낌입니다 ...
FrustratedWithFormsDesigner

실제 데이터 유형은 유일한 비트입니다.
Dan McGrath

1
@FrustratedWithForms 같은 생각으로 "저는 'Atom'이라고 말했습니다! 이것은 (a) Lisp처럼 보이지만 불필요한 분배기가 있습니다. : P
Mark C

3

Felix에는 익명 합계 유형이 있습니다. 유형은 다음과 같습니다.

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 단위의 합입니다. 동정 +가 연관성이없는 것은 :)


2

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

2

C ++에서 유니온이 처음 들었을 때 '기발한'것으로 나타났습니다. 나는 그들이 구현해야 할 명백한 선택 인 시나리오에 아직 맞지 않았다.


3
유니온은 C에서 나왔습니다. PHP의 zval 구조체가 좋은 예입니다.
Martin Wickman

2
16 비트 레지스터를 전체 레지스터 (HL, BC) 및 8 비트 레지스터 (H, L, B 및 C)로 쉽게 액세스하기 위해 Z80 에뮬레이터에서 사용했습니다. 이것은 Z80 asm에서 어떻게 사용되는지 반영합니다. 또한 "variants"에서 다른 유형의 값을 가질 수있는 클래스 (예 : int / float)-왜 서브 클래스를 사용하지 않았는지 확실하지 않지만 당시에는 의미가있었습니다. :
ggambett

@ggambett : Z80 프로그램에서 똑같은 일을했습니다! F 레지스터의 개별 플래그에 액세스하기 위해 비트 필드도 추가했습니다.
Konamiman

2

나는 아직도 F # 및 다른 기능적 언어에서 다중 매개 변수 기능이되는 것에 대해 머리를 감싸려고 노력하고 있습니다. 기본적으로 int f (Foo, Bar)func f (Foo)가됩니다.

즉, Foo를 가져 와서 Bar를 가져 와서 int를 리턴하는 두 개의 매개 변수 함수는 실제로 Foo를 가져 와서 Bar를 가져 와서 int를 리턴하는 하나의 매개 변수 함수를 리턴하는 하나의 매개 변수 함수입니다. 그러나 원하는 경우 두 가지 매개 변수를 사용하여 호출 할 수 있습니다. 나는 여기 에 대한 게시물을 썼다


8
오히려 함수 f(Foo, Bar)는 반환 할 값을 반환하는 f(Foo)다른 함수 f'(Bar)를 반환하는 함수 와 동일 합니다 f(Foo, Bar). 즉, 'Foo'인수를 수정하지만 'Bar'가 아닌 경우 'Foo'에 의존하지 않지만 여전히 'Bar'인수에 종속되는 함수가 있습니다. 이것은 기능적 언어에 일반적입니다. '카레'라고합니다.
9000

2

정규식 :

그것들은 매우 강력하지만 컴팩트 한 물체입니다.
언어를 내장 한 언어는 텍스트를 조작 할 수있는 능력이 뛰어납니다 (구문을 잘 못 듣습니다.)


2
많은 간단한 문법을 ​​정규 표현식으로 구문 분석하는 것이 전적으로 가능합니다. 예를 들어, 일련의 정규식 위에 최소한의 논리로 ini 파일을 구문 분석하는 것은 비교적 사소한 일입니다. 많은 사람들이 저지르는 실수는 매우 복잡한 문법을 ​​구문 분석하려고 시도하는 것입니다 (예 : XML / HTML).
Matthew Scharley


@Mark C : 최고는 정답입니다 (레코드 4320을 기록한 기록). 당신은 할 수 없습니다
Martin York

예, 그것은 유머였습니다. 내가 Matthew의 의견을 읽을 때 마음이 떠올랐다.
Mark C

2

기능 패밀리의 소수의 언어에는 Unity라는 유형의 클래스가 있습니다. Unity 유형의 특징은 정보가없고 0 비트 유형이라는 점입니다. 단일 유형 (일부 변형)도 유일한 값이거나 (대부분의 다른 유형에서는) 하나의 값만 있습니다 (그 자체가 유형이 아님).

그러나 이들은 구별 유형이기 때문에 유용합니다. 하나의 단일 형식에서 다른 단일 형식으로 암시 적으로 변환 할 수 없으므로 정적 형식 검사를 사용하여 매우 효율적이고 표현적인 방식으로 작동 할 수 있습니다.

유니티는 새로운 유형이 다른 유형의 정의 된 세트 중 하나 일하거나 설명 할 수 있도록하여, 대부분의 이러한 언어 열거 형 설명하는 방법이다 어쩌면 (말의 정수) 전형적인 형태의 값이 될 수 있습니다 유형, 값을 또는 값이없는 값을 나타냅니다.

풍부한 사용자 정의 유니티 유형을 사용하지 않는 일부 언어는 여전히 어떤 형태로든 다른 형태로 통합되어 있습니다. 예를 들어, 파이썬은 적어도 세 가지 통일 유형을 가지고 NoneType, NotImplementedType하고 EllipsisType. 처음 두 가지 모두 "값 없음"과 같은 것을 의미하지만, 세 번째는 복잡한 값 (특히 슬라이스 식)에서 흥미로운 특수 사례를 나타내는 데 사용됩니다.

유니티의 다른 흥미로운 예로는 NULLSQL과 undefined자바 스크립트가 있지만 voidC 또는 C ++ 에는 없습니다 . void실패합니다. 정보가없는 값을 설명하지만 실제 값은 유형이 될 수 없습니다 void.


"단위 유형"을 의미한다고 생각합니다.
Jason Baker

2

루비의 symbol유형은 조금 이례적입니다. 본질적으로 싱글 톤 패턴을 구현하는 문자열입니다. 또는 뭔가. 지금까지 심볼을 가장 잘 사용하는 것은 상태 추적과 함수 이름 전달에 있습니다.


또한 O (1) 키 비교를위한 맵의 키로도 사용됩니다.
Jeremy Heiler

글쎄, 그렇게 특이한 것은 아닙니다. 루비는 이것을 스몰 토크에서 물려 받았으며, Lisp에서 물려 받았습니다. 스칼라도 가지고 있다고 생각합니다. 실제로, 거의 모든 언어 구현 (컴파일러 또는 인터프리터)에는 내부적으로 심볼 테이블이 있으며 Lisp, Smalltalk 및 Ruby는이를 프로그래머에게 노출시킵니다.
Jörg W Mittag 2016

1

코볼. 기본적으로 두 가지 기본 데이터 유형, 문자열 및 숫자 만 있지만 메모리에 배치되는 방법을 정확하게 지정해야 합니다 ( 예 :) PIC S9(5)V99 COMP-3.


나는 그것을 이길 수 있습니다. BCPL에는 한 가지 데이터 유형 (워드)이 있습니다. en.wikipedia.org/wiki/BCPL
Stephen C

다른 유형의 숫자가 있습니다 (COMP, COMP-1, COMP-2, COMP-3).
David Thornley

끔찍하게 들립니다. 이러한 세부 사항의 의미에 대해 자세히 설명해 주시겠습니까?
Mark C

S= 부호, 9(5)= 5 자리, V= 암시 적 소수점, 99= 2 자리 이상, COMP-3= BCD + 부호 nybble.
dan04

1

클리퍼는 익명 코드와 비슷한 '코드 블록'을 가졌습니다. 일반적으로 콜백 형태로 필요에 따라 전달되고 평가 될 수 있습니다. 데이터 테이블을 제시 할 때 즉석에서 계산을 수행하는 것과 같은 작업에 자주 사용합니다.


0

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;

연산자 오버로딩과 함께 매우 흥미로운 것을 정의 할 수 있습니다.


0

Clojure는 언어에 널리 퍼지는 "추상"이라는 메타 개념을 가지고 있기 때문에 흥미 롭습니다. 예 :

  • 컬렉션
  • 시퀀스 (lazy 및 non-lazy)
  • 고차 함수
  • 멀티 메소드
  • 프로토콜
  • 관리 참조
  • 매크로
  • 다른 여러 .....

어느 정도까지 추상화는 " 단일 책임 원칙을한다 "을 극도로 . 원하는 기능을 얻기 위해 작성하는 것은 사용자의 몫이지만, 서로 접착하는 방법에 대해 매우 유연 할 수 있습니다.

예를 들어 상속이있는 클래스 기반 OOP 시스템을 원하는 경우 이러한 핵심 추상화 중 하나를 비교적 빠르게 구축 할 수 있습니다.

실제로 추상화 자체는 여러 구현이 가능한 방식으로 설계됩니다 (예 : 시퀀스의 경우 clojure.lang.ISeq 또는 고차 함수의 경우 clojure.lang.IFn과 같은 특정 인터페이스를 통해).

이 주제에 관한 흥미로운 비디오가 있습니다 : The Art of Abstraction


0

고유 한 유형의 언어를 원하면 BCPL찾으십시오 . 이 언어에는 언어 구현을위한 고정 된 비트 수인 단어 하나의 데이터 유형 만 있습니다.


0

Googles Go에는 매우 독특한 '채널'유형이 있습니다.


1
채널은 고유하지 않습니다. 많은 언어가 있습니다. 펠릭스는 구글이 존재하기 10 년 전에 그들에게있었습니다.
트릴

그리고 Ocaml이 존재하기 전에 채널을 가지고있는 다른 언어가 하나 이상있었습니다. 프로그래밍 언어에서 여전히 사용 가능한 유형 중 하나입니다.
Brainlag
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.