ML계열에서 유명한 언어로 sml, ocaml이 있는데 예전엔 모르겠지만 요즘엔 둘다 하스켈한테 생태계로 밀림. 그렇다고 언어 완성도가 더 뛰어난것도 아니고. ML은 strict evaluation을 한다는게 하스켈하고 다르긴 한데, 일반적인 상황에서는 lazy든 strict이든 크게 상관없음.
그나마 F#이 .net에서 돈다는 특수성이 있긴 하지만
사실 다형성만 해도 ML쪽에서 쓰는 모듈보다 하스켈 타입클래스가 훨씬 편리함.
댓글 20
근데 ocaml쪽 문법은 최신 언어들에 은근 쓰이더라. 러스트나 리스크립트등등
black7375(221.168)2022-05-03 19:27
답글
PL연구자들이 이상하게 수상할정도로 OCaml 좋아하긴 함. Inria에서 만들어서 그런지..? rust, rescript가 그런 이유로 ocaml 문법을 채택한건 아닐것 같긴 하지만.
다믜(damhiya)2022-05-03 19:31
그러니 C# 패키지도 내맘대로 가져다가 쓸 수 있는 F#할래오?
구름(bluegkstjr)2022-05-03 22:43
답글
어차피 시샵 쓸줄 모르걸랑요
다믜(damhiya)2022-05-03 22:46
하스켈은 없데이트잖아
익명(118.32)2022-05-03 23:27
답글
없데이트란게 언어적 개선이 없다고 말하는거면 전혀 아니다. 당장 GHC에 linear haskell 같은 고급 언어확장들이 들어왔음.
다믜(damhiya)2022-05-04 00:08
해당 댓글은 삭제되었습니다.
해당 댓글은 삭제되었습니다.2026-07-29 21:40
답글
하스켈 orphan instance는 걍 warning인데..?
다믜(damhiya)2022-05-04 00:10
답글
overlapping instance랑 orphan instance는 연관은 있지만 다른거고, 하스켈은 항상 타입에 대응되는 인스턴스가 전역에 하나뿐이어야만 함.
다믜(damhiya)2022-05-04 00:21
답글
한 타입에 대해서 다른 동작하는 두 인스턴스를 모두 사용하는건 불가능하고, newtype으로 우회하는게 하스켈식 해결법임.
다믜(damhiya)2022-05-04 00:23
답글
OverlappingInstance라 불리는 옵션은 여러개 인스턴스를 동시에 쓰는게 아니라 사용할 수 있는 여러 인스턴스중 한가지로 resolution이 일어나게 하는 확장임
다믜(damhiya)2022-05-04 00:25
답글
인스턴스가 전역적으로 유일한게 타입클래스의 핵심임. 이래야 무슨 인스턴스를 사용해야 하는지 명시할 필요가 없거든. 그리고 class는 다형성 때문에 쓰는거지 overloading처럼 이름충돌 문제 때문에 쓰는건 아님. semigroup이라는 클래스를 만들어두면 임의의 semigroup에 대해 작동하는 함수를 만들수 있지.
다믜(damhiya)2022-05-04 00:39
답글
모듈마다 add 만든다는게 standard ml처럼 add라는 signature가 있는 structure를 구현하는걸 말하는거면 좀 비교할 수 있는데, standard ml은 typeclass constraint처럼 제약을 유연하게 거는게 안되는걸로 보임.
다믜(damhiya)2022-05-04 00:43
답글
그거는 정말 중요한 차이가 있는데, sml signature는 type variable이 existential이고, typeclass는 universal임. universal하고 existential둘다 각각 유용한 상황이 있지만 보통 universal이 더 편함.
다믜(damhiya)2022-05-04 00:54
답글
typeclass는 원래 universal만 되지만 언어 확장을 켜서 associated type을 쓰면 existential 타입 변수도 쓸 수 있음. sml, ocaml module에서 universal type variable이 되는지는 잘 모르겠다.
다믜(damhiya)2022-05-04 00:56
답글
예를 들어서 타입클래스 A, B가 있을 때 (A a, B a) => ..라고 제약을 걸면 a라는 타입에 대해서 A, B 두 인스턴스를 다 쓸 수 있음. 이게 가능한 이유는 A, B가 type variable에 대해 parameterized 돼있어서 그럼.
다믜(damhiya)2022-05-04 00:59
답글
근데 structure, module같이 인스턴스가 type variable을 existential하게 들고 있으면 저런식으로 여러개를 조합하는게 불가능함
다믜(damhiya)2022-05-04 00:59
답글
signature가 A, B인 structure X, Y를 인자로 받는 functor를 만든다 치면, X가 들고 있는 타입변수와 Y가 들고있는 타입변수가 같다는 조건을 줄수가 없거든.
근데 ocaml쪽 문법은 최신 언어들에 은근 쓰이더라. 러스트나 리스크립트등등
PL연구자들이 이상하게 수상할정도로 OCaml 좋아하긴 함. Inria에서 만들어서 그런지..? rust, rescript가 그런 이유로 ocaml 문법을 채택한건 아닐것 같긴 하지만.
그러니 C# 패키지도 내맘대로 가져다가 쓸 수 있는 F#할래오?
어차피 시샵 쓸줄 모르걸랑요
하스켈은 없데이트잖아
없데이트란게 언어적 개선이 없다고 말하는거면 전혀 아니다. 당장 GHC에 linear haskell 같은 고급 언어확장들이 들어왔음.
해당 댓글은 삭제되었습니다.
하스켈 orphan instance는 걍 warning인데..?
overlapping instance랑 orphan instance는 연관은 있지만 다른거고, 하스켈은 항상 타입에 대응되는 인스턴스가 전역에 하나뿐이어야만 함.
한 타입에 대해서 다른 동작하는 두 인스턴스를 모두 사용하는건 불가능하고, newtype으로 우회하는게 하스켈식 해결법임.
OverlappingInstance라 불리는 옵션은 여러개 인스턴스를 동시에 쓰는게 아니라 사용할 수 있는 여러 인스턴스중 한가지로 resolution이 일어나게 하는 확장임
인스턴스가 전역적으로 유일한게 타입클래스의 핵심임. 이래야 무슨 인스턴스를 사용해야 하는지 명시할 필요가 없거든. 그리고 class는 다형성 때문에 쓰는거지 overloading처럼 이름충돌 문제 때문에 쓰는건 아님. semigroup이라는 클래스를 만들어두면 임의의 semigroup에 대해 작동하는 함수를 만들수 있지.
모듈마다 add 만든다는게 standard ml처럼 add라는 signature가 있는 structure를 구현하는걸 말하는거면 좀 비교할 수 있는데, standard ml은 typeclass constraint처럼 제약을 유연하게 거는게 안되는걸로 보임.
그거는 정말 중요한 차이가 있는데, sml signature는 type variable이 existential이고, typeclass는 universal임. universal하고 existential둘다 각각 유용한 상황이 있지만 보통 universal이 더 편함.
typeclass는 원래 universal만 되지만 언어 확장을 켜서 associated type을 쓰면 existential 타입 변수도 쓸 수 있음. sml, ocaml module에서 universal type variable이 되는지는 잘 모르겠다.
예를 들어서 타입클래스 A, B가 있을 때 (A a, B a) => ..라고 제약을 걸면 a라는 타입에 대해서 A, B 두 인스턴스를 다 쓸 수 있음. 이게 가능한 이유는 A, B가 type variable에 대해 parameterized 돼있어서 그럼.
근데 structure, module같이 인스턴스가 type variable을 existential하게 들고 있으면 저런식으로 여러개를 조합하는게 불가능함
signature가 A, B인 structure X, Y를 인자로 받는 functor를 만든다 치면, X가 들고 있는 타입변수와 Y가 들고있는 타입변수가 같다는 조건을 줄수가 없거든.
댓삭튀 킹받네... 저럴거면 개인적으로 물어보면 안되나 - dc App
ㄹㅇ