Flix(프로그래밍 언어)

Flix (programming language)
훼릭스
패러다임멀티패러다임: 기능, 명령, 논리
개발자오르후스 대학교, 오픈 소스 기고자
타이핑 분야유추, 정적, 강력, 구조
플랫폼JVM
면허증.Apache License 2.0.[1]
파일 이름 확장자.flix
웹 사이트flix.dev
영향을 받다
F#, Go, Haskell, OCaml, Scala

Flix덴마크 독립연구기금 [2] 오픈소스 [3]기부자 커뮤니티에서 자금을 지원받아 오르후스 대학에서 개발된 기능적, 명령적, 논리적인 프로그래밍 언어입니다.Flix 언어는 대수 데이터 유형, 패턴 매칭, 파라메트릭 다형성, 커리잉, 고차 함수, 확장 가능한 레코드,[4] 채널프로세스 기반 동시성테일제거지원합니다.Flix의 두 가지 주목할 만한 특징은 유형 및 효과[5] 시스템과 1등급 데이터로그 [6]구속조건에 대한 지원입니다.

Flix 유형 및 효과 시스템은 Hindley-Milner 스타일의 유형 추론을 지원합니다.시스템은 순수 코드와 불순 코드를 구분합니다. 식을 순수하게 입력하면 런타임에 효과를 낼 수 없습니다.고차 함수는 순수한(또는 불순한) 함수 인수를 부여하도록 강제할 수 있습니다.유형 및 효과 시스템은 효과 다형성[7][8] 지원합니다. 즉, 고차 함수의 효과는 인수의 효과에 따라 달라질 수 있습니다.

Flix는 데이터로그 프로그램을 1등급 값으로 지원합니다.데이터로그 프로그램 값, 즉 데이터로그 사실과 규칙 모음을 함수와 주고받고, 데이터 구조에 저장되며, 다른 데이터로그 프로그램 값과 함께 구성할 수 있습니다.데이터로그 프로그램 값의 최소 모델은 계산할 수 있으며, 그 자체가 데이터로그 프로그램 값입니다.이렇게 하면 Flix를 데이터로그의 메타 프로그래밍 언어로 볼 수 있습니다.Flix는 계층화된 부정을 지원하며 Flix 컴파일러는 컴파일 시 [9]계층화를 보장합니다.또한 Flix는 술어가 격자 [10][11][12][13]시멘틱스가 주어지는 데이터로그 제약의 강화된 형식을 지원합니다.

개요

Flix는 ML 계열의 프로그래밍 언어입니다.유형 및 효과 시스템은 행 다형성 및 부울 통합여러 확장 기능을 가진 힌들리 밀너에 기반을 두고 있습니다.Flix 구문은 Scala에서 영감을 받아 짧은 키워드와 컬리브릿지를 사용합니다.Flix는 함수 호출을 가능하게 하는 균일한 함수 호출 구문을 지원합니다.f(x, y, z)로 써지다x.f(y, z)Flix의 동시성 모델은 Go에서 영감을 받아 채널과 프로세스를 기반으로 합니다.프로세스는 다른 프로세스와 메모리를 공유(변환 가능)하지 않는 경량 스레드입니다.프로세스는 불변의 메시지의 제한 큐 또는 무제한 큐인 채널을 통해 통신합니다.

많은 프로그래밍 언어가 함수형 프로그래밍과 명령형 프로그래밍의 혼합을 지원하지만, Flix 유형 및 이펙트 시스템은 모든 표현의 순수성을 추적하여 Flix 프로그램의 일부를 이펙트 시스템에 의해 강제된 순수함수 스타일로 작성할 수 있습니다.

Flix 프로그램은 JVM 바이트 코드로 컴파일되며 Java Virtual Machine(JVM;[14] Java 가상 머신)에서 실행할 수 있습니다.Flix 컴파일러는 전체 프로그램 컴파일을 수행하며, 단일 동형[15]통해 다형성을 제거하고, 도달 불가능한 코드를 제거하기 위해 트리 흔들기를 사용합니다.모노모르피제이션은 더 긴 컴파일 시간과 더 큰 실행 가능 바이너리를 희생하면서 원시 값의 박스를 회피합니다.Flix는 [16]Java로 작성된 프로그램과의 상호 운용성을 지원합니다.

Flix는 테일콜 제거를 지원하므로 테일 포지션의 함수콜이 스택스페이스를 소비하지 않기 때문에 콜스택이 [17]오버플로하지 않습니다.JVM 명령어세트는 테일콜을 명시적으로 지원하지 않기 때문에 이러한 콜은 재사용 가능한 스택프레임의 [18]형식을 사용하여 에뮬레이트 됩니다.Flix의 모든 반복은 재귀에 의해 표현되기 때문에 테일콜 제거 지원은 중요합니다.

Flix 컴파일러는 미사용 로컬 변수, 미사용 함수, 미사용 형식 파라미터, 미사용 형식 파라미터, 미사용 유형 파라미터, 미사용 유형 선언 등 대부분의 형식의 미사용 또는 용장 코드를 허용하지 않습니다.[19]가변 섀도우링도 허용되지 않습니다.기술된 근거는 사용되지 않거나 중복된 코드가 종종 잘못된[20] 코드와 관련되어 있다는 것입니다.

Flix용 Visual Studio 코드 확장을 사용[21]수 있습니다.확장 기능은 Microsoft에서 개발 중인 IDE와 컴파일러 간의 공통 인터페이스인 Language Server Protocol을 기반으로 합니다.

Flix는 Apache 2.0 라이센스로 제공되는 오픈 소스 소프트웨어입니다.

안녕 세계

컴파일 및 실행 시 다음 프로그램이 "Hello World!"를 출력합니다.

방어하다 주된(): 구성 단위 & 불순물 =      콘솔.프린트 라인('헬로 월드') 

의 유형 및 효과 시그니처mainfunction은 파라미터가 없음을 지정하고 type의 값을 반환합니다.Unit함수가 불순하다는 것을 나타냅니다.main함수는 호출하기 때문에 불순합니다.printLine불순한 거죠

대수적 데이터 유형 및 패턴 일치

다음 프로그램 fragment는 다음과 같은 이름의 대수 데이터 유형(ADT)을 선언합니다.Shape:

열거하다 모양. {     사례. 원형(내부),        // 원의 반지름이 있습니다.     사례. 광장(내부),        // 측면 길이 있음     사례. 직사각형(내부, 내부) // 높이와 폭이 있습니다. } 

ADT에는 다음 3개의 컨스트럭터가 있습니다.Circle,Square,그리고.Rectangle.

다음 프로그램 fragment는 패턴 매칭을 사용하여,Shape값:

방어하다 지역(s: 모양.): 내부 = 경기 s {     사례. 원형(r)       => 3 * (r * r)     사례. 광장(w)       => w * w     사례. 직사각형(h, w) => h * w } 

고차 함수

다음 프로그램 fragment는 다음과 같은 이름의 고차 함수를 정의합니다.twice어떤 기능이 주어졌을 때f부터Int로.Int적용되는 함수를 반환합니다.f2회 입력:

방어하다 두번이라.(f: 내부 -> 내부): 내부 -> 내부 = x -> f(f(x)) 

기능을 사용할 수 있습니다.twice다음과 같습니다.

두번이라.(x -> x + 1)(0) 

여기서의 전화는twice(x -> x + 1)인수를 2배로 늘리는 함수를 반환합니다.따라서 전체 표현의 결과는0 + 1 + 1 = 2.

파라메트릭 다형

다음 프로그램 조각은 함수를 매핑하는 다형 함수를 보여줍니다.f: a -> b유형 요소 목록을 검토하여a유형 요소 목록 반환b:

방어하다 지도(f: a -> b, l: 목록.[a]): 목록.[b] = 경기 l {     사례. 제로     => 제로     사례. x :: xs => f(x) :: 지도(f, xs) } 

map함수는 목록을 재귀적으로 통과합니다.l및 적용f새 목록을 구성하는 각 요소에 대해 설명합니다.

Flix는 유형 매개 변수 삭제를 지원하므로 유형 매개 변수를 사용할 필요가 없습니다.a그리고.b가 명시적으로 도입되어 있습니다.

확장 가능한 레코드

다음 프로그램 조각은 두 개의 필드로 레코드를 구성하는 방법을 보여 줍니다.x그리고.y:

방어하다 포인트 2d(): {x: 내부, y: 내부} = {x = 1, y = 2} 

Flix는 행 다형을 사용하여 레코드를 입력합니다.sum아래 함수는 다음을 가진 레코드를 가져옵니다.x그리고.y필드(및 기타 필드)와 두 필드의 합계를 반환합니다.

방어하다 (r: {x: 내부, y: 내부   쉬다}): 내부 = r.x + r.y 

다음으로 에 대한 유효한 콜을 나타냅니다.sum기능:

({x = 1, y = 2}) ({y = 2, x = 1}) ({x = 1, y = 2, z = 3}) 

특장점

다형 효과

Flix 유형 및 효과 시스템은 순수 [5][22][23]표현과 불순 표현을 구분합니다.순수한 표현은 참조상 투명함을 보증한다.순수 함수는 동일한 인수가 지정되면 항상 동일한 값을 반환하며 어떠한 (관측 가능한) 부작용도 가질 수 없습니다.

예를 들어, 다음 식은 유형입니다.Int그리고Pure:

1 + 2 : 내부 & 순수하다 

반면 다음 표현은Impure:

콘솔.프린트 라인('헬로 월드') : 구성 단위 & 불순물 

고차 함수는 함수 인수가 순수, 불순 또는 효과 다형이어야 함을 지정할 수 있습니다.

예를 들어, 의 정의Set.exists그 함수 인수가 필요하다.f순수:

// 구문 a -> Bool은 -> Bool & Pure의 짧은 표현입니다. 방어하다 존재한다(f: a -> , xs: 세트[a]):  = ... 

다음과 같은 요건f구현 세부 정보가 유출되지 않도록 해야 합니다.예를 들어,f순수합니다. 세트의 요소가 어떤 순서로 횡단되는지 결정하는 데 사용할 수 없습니다.한다면f예를 들어, 현재 요소를 인쇄하는 기능을 전달하여 세트 내의 내부 요소 순서를 공개함으로써 이러한 세부 정보가 누출될 수 있습니다.

고차 함수는 함수의 불순함을 요구할 수도 있습니다.

예를 들어, 의 정의List.foreach그 함수 인수가 필요하다.f불순한 경우:

// 구문 a ~> 유닛은 -> 유닛 및 불순물에 대해 단수입니다. 방어하다 앞지르다(f: a ~> 구성 단위, xs: 목록.[a]): 구성 단위 & 불순물 

다음과 같은 요건f불순물이어야 합니다.코드가 의미가 있는지 확인합니다.전화해도 소용없을 거야List.foreach그것은 항상 돌아오기 때문에 순수한 기능을 가지고Unit.

종류와 효과는 좋지만 완전하지는 않다.즉, 함수가 순수하면 영향을 미칠 수 없는 반면, 함수가 불순하다면 영향을 미칠 수 있지만 반드시 그런 것은 아니다.예를 들어, 다음 식은 런타임에 효과를 낼 수 없음에도 불순합니다.

한다면 (1 == 2) 콘솔.프린트 라인('헬로 월드') 또 다른 () 

고차 함수도 영향을 줄 수 있습니다.다형 함수의 효과는 인수에 따라 달라질 수 있습니다.

예를 들어 표준 라이브러리 정의:List.map효과 다형성:[24]

방어하다 지도(f: a -> b & e, xs: 목록.[a]): 목록.[b] & e 

List.map함수는 함수를 갖는다.f활자 요소에서a로.b유효하게e지도 기능의 효과는 그 자체입니다.e결과적으로, 만약List.map순수한 함수로 호출되는 경우 표현식 전체가 순수한 반면, 불순한 함수로 호출되는 경우 표현식 전체가 불순합니다.효과 다형성입니다.

여러 함수 인수를 사용하는 고차 함수는 이러한 효과를 결합할 수 있습니다.

예를 들어, 순방향 함수 구성의 표준 라이브러리 정의 >>두 함수 인수가 [25]모두 순수한 경우 순수합니다.

방어하다 >>(f: a -> b & e1, g: b -> c & e2): a -> c & (e1 그리고. e2) = x -> g(f(x)) 

유형 및 효과 시그니처는 다음과 같이 이해할 수 있습니다.>>함수는 다음 두 가지 함수 인수를 사용합니다.f유효하게e1그리고.g유효하게e2의 효과>>이펙트 다형성이라는 것은e1그리고.e2둘 다 순수하면(그 효과가 참), 전체 표현은 순수합니다(참).그렇지 않으면 불순하다.

유형 및 효과 시스템에서는 임의의 부울식을 사용하여 함수 인수의 순수성을 제어할 수 있습니다.

예를 들어, 고차 함수를 표현할 수 있습니다.h2개의 함수 인수를 받아들인다.f그리고.g그 중 기껏해야 한 가지는 불순하다.

방어하다 h(f: a -> b & e1, g: b -> c & (것은 아니다. e1 또는 e2)): 구성 단위 

한다면hfunction 인수를 사용하여 호출됩니다.f불순한(거짓) 두 번째 인수는 순수해야 합니다(참).반대로 만약f그럼 순수(진짜)한 거야g순수(참) 또는 불순(거짓)일 수 있습니다.호출하는 것은 컴파일 시간 오류입니다.h두 가지 불순한 기능이 있습니다.

유형 및 효과 시스템은 문장 표현이 유용하다는 것을 보증하기 위해 사용될 수 있습니다. 즉, 표현식 또는 함수를 평가하여 그 결과를 폐기할 경우 반드시 부작용이 있어야 합니다.예를 들어, 아래의 프로그램 fragment를 컴파일 합니다.

방어하다 주된(): 구성 단위 & 불순물 =      목록..지도(x -> 2 * x, 1 :: 2 :: 제로);     콘솔.프린트 라인('헬로 월드') 

컴파일러 에러가 발생합니다.

-- 용장성 오류 ------------------------------------------------------------------------------------------------------------  >> 쓸모없는 표현:부작용은 없으며 결과는 폐기됩니다.  2 List.map(x -> 2 * x, 1 :: 2 :: Nill); ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 쓸데없는 표현 

왜냐하면 순수한 표현을 평가하는 것은 비이성적이기 때문이다.List.map(x -> 2 * x, 1 :: 2 :: Nil)그 결과를 파기하기 위해서요대부분의 경우 프로그래머는 결과를 사용하려고 했습니다(또는 식이 중복되어 삭제될 수 있습니다).따라서 Flix는 이러한 프로그램을 거부합니다.

1등급 데이터로그 구속조건

Flix는 데이터로그 프로그램을 1등급 [6][9][26]값으로 지원합니다.데이터로그 프로그램은 순서가 매겨지지 않은 사실과 규칙의 모음으로 구성된 논리 프로그램입니다.사실과 규칙은 모두 최소 모델, 즉 모든 데이터로그 프로그램에 대한 고유한 솔루션을 의미합니다.Flix에서 데이터로그 프로그램 값은 함수와 주고받고, 데이터 구조에 저장되며, 다른 데이터로그 프로그램 값과 함께 구성되며, 해결할 수 있습니다.데이터로그 프로그램(최소 모델)에 대한 해결책은 데이터로그 프로그램 자체입니다.따라서 한 데이터로그 프로그램의 솔루션, 즉 "출력"이 다른 데이터로그 프로그램의 "입력"이 되는 데이터로그 프로그램의 파이프라인을 구성할 수 있습니다.

다음 에지 팩트가 그래프를 정의합니다.

엣지(1, 2). 엣지(2, 3). 엣지(3, 4). 

다음 데이터로그 규칙은 에지 관계의 전이 폐쇄를 계산합니다.

경로.(x, y) :- 엣지(x, y). 경로.(x, z) :- 경로.(x, y), 엣지(y, z). 

사실과 규칙의 최소 모델은 다음과 같습니다.

엣지(1, 2). 엣지(2, 3). 엣지(3, 4).  경로.(1, 2). 경로.(2, 3). 경로.(3, 4).  경로.(1, 3). 경로.(1, 4). 경로.(2, 4). 

Flix에서 데이터로그 프로그램은 값입니다.위의 프로그램은 다음과 같이 Flix에 내장할 수 있습니다.

방어하다 주된(): #{엣지(Int, Int), 경로(Int, Int)} =   허락하다 f = #{       엣지(1, 2). 엣지(2, 3). 엣지(3, 4).   };   허락하다 p = #{     경로.(x, y) :- 엣지(x, y).     경로.(x, z) :- 경로.(x, y), 엣지(y, z).   };   풀다 f <+> p 

로컬 변수f에는 에지 사실로 구성된 Datalogger 프로그램 값이 저장됩니다.마찬가지로 로컬 변수도p는 두 가지 규칙으로 구성된 데이터로그 프로그램 값입니다.f <+> p식은 두 데이터로그 프로그램의 구성(즉, 결합)을 계산합니다.f그리고.p.그solve식 - 위에 표시된 에지 및 경로 사실을 반환하여 결합된 데이터로그 프로그램의 최소 모델을 계산합니다.

Datalog 프로그램은 1등급 값이기 때문에 위의 프로그램을 여러 함수로 재팩터링할 수 있습니다.예를 들어 다음과 같습니다.

방어하다 가장자리(): #{엣지(Int, Int), 경로(Int, Int)} = #{     엣지(1, 2). 엣지(2, 3). 엣지(3, 4). }  방어하다 닫힘(): #{엣지(Int, Int), 경로(Int, Int)} = #{     경로.(x, y) :- 엣지(x, y).     경로.(x, z) :- 경로.(x, y), 엣지(y, z). }  방어하다 주된(): #{Edge(Int, Int), Path(Int, Int)} = 해결 에지() <+> closure() 

그래프의 무방향 닫힘은 규칙을 추가하여 계산할 수 있습니다.

경로.(x, y) :- 경로.(y, x). 

수정이 가능합니다.closure함수는 직접 닫힘 또는 비방향 닫힘 계산 여부를 결정하는 부울 인수를 사용합니다.

방어하다 닫힘(연출된: ): #{엣지(Int, Int), 경로(Int, Int)} =     허락하다 p1 = #{         경로.(x, y) :- 엣지(x, y).         경로.(x, z) :- 경로.(x, y), 엣지(y, z).     };     허락하다 p2 = #{         경로.(y, x) :- 경로.(x, y).     };     한다면 (연출된) p1 또 다른 (p1 <+> p2) 

타입 세이프 구성

Flix 유형 시스템은 Datalogger 프로그램 값이 올바르게 입력되도록 보장합니다.

예를 들어, 다음 프로그램 fragment는 check를 입력하지 않습니다.

허락하다 p1 = 엣지(123, 456).; 허락하다 p2 = 엣지("a", "b").; p1 <+> p2; 

에 있기 때문에p1의 종류Edge술어는Edge(Int, Int)반면에p2활자가 있다Edge(String, String)Flix 컴파일러는 잘못된 타입의 프로그램을 거부합니다.

계층화된 부정

Flix 컴파일러는 런타임에 생성된 모든 데이터로그 프로그램 값을 계층화합니다.계층화는 부정이 존재하는 경우 고유한 최소 모델의 존재를 보장하므로 중요합니다.직관적으로 [27]부정을 통한 재귀가 없는 경우(즉, 술어 자체에 부정적으로 의존할 수 없는 경우) 데이터로그 프로그램이 계층화됩니다.Datalogger 프로그램이 지정되면 사이클 감지 알고리즘을 사용하여 계층화 여부를 확인할 수 있습니다.

예를 들어, 다음 Flix 프로그램에는 계층화할 수 없는 식이 포함되어 있습니다.

방어하다 주된(): #{남성(줄), 남편(줄), 학사(줄)} =     허락하다 p1 = 남편.(x)  :- 남자(x), 것은 아니다. 미혼남(x).;     허락하다 p2 = 미혼남(x) :- 남자(x), 것은 아니다. 남편.(x).;     p1 <+> p2 // 계층화되지 않은 불법입니다. 

마지막 식이 우선 순위 그래프가 음의 사이클을 포함하는 데이터로그 프로그램 값을 구성하기 때문입니다.Bachelor에 부정적으로 의존하다Husband차례로 (긍정적으로) 의존하는 것을 기술하다Bachelor술어

Flix 컴파일러는 모든 Datalog 프로그램 값 표현식에 대한 우선 순위 그래프를 계산하고 컴파일 시 해당 계층화를 결정합니다.표현식이 계층화되지 않으면 프로그램은 컴파일러에 의해 거부됩니다.

계층화는 건전하지만 보수적이다.예를 들어, 다음 프로그램이 부당하게 거부됩니다.

방어하다 주된(): #{A(Int), B(Int)} =     한다면 (진실의)          A(x) :- A(x), 것은 아니다. B(x).     또 다른         B(x) :- B(x), 것은 아니다. A(x). 

유형 시스템은 보수적으로 if 표현식의 양쪽 분기를 취할 수 있다고 가정하고 결과적으로 두 분기의 사이에 음의 사이클이 있을 수 있다고 추론합니다.A그리고.B술어따라서 프로그램은 거부됩니다.이것은 런타임에 이 시스템이main함수는 항상 계층화된 데이터로그 프로그램 값을 반환합니다.

설계 철학

Flix는 다음과 같은 일련의 [28]원칙을 바탕으로 설계되었습니다.

  • 모든 것은 표현이다.최상위 선언을 제외한 대부분의 Flix 구조는 값을 평가하는 표현입니다.
  • 폐쇄적인 가정Flix 컴파일러는 전체 프로그램의 소스 코드를 컴파일 시에 사용할 수 있다고 가정합니다.
  • 순수 코드와 불순 코드가 분리됩니다.유형 및 효과 시스템은 표현이 효과를[29] 낼 수 있는지 여부를 정확하게 포착합니다.
  • 언어에는 컴파일 시 경고는 없고 오류만 있습니다.

이 원칙에는 의도적으로 생략된 프로그래밍 언어 기능도 몇 가지 나열되어 있습니다.특히 Flix는 다음을 지원하지 않습니다.

  • null 값입니다.대신 옵션 데이터 유형을 사용하는 것이 좋습니다.
  • 암묵적인 강압.대신 타입 변환은 프로그래머에 의해 명시적으로 실행되어야 합니다.
  • 반성.프로그래머는 런타임에 프로그램의 구조를 반영할 수 없습니다.

레퍼런스

  1. ^ "Apache License 2.0" – via GitHub.
  2. ^ "Forskningsprojekter". Danmarks Frie Forskningsfond (in Danish).
  3. ^ "Flix Authors". GitHub.
  4. ^ Leijen, Daan. "Extensible records with scoped labels". Trends in Functional Programming.
  5. ^ a b Madsen, Magnus; van de Pol, Jaco (13 November 2020). "Polymorphic Types and Effects with Boolean Unification". Proceedings of the ACM on Programming Languages. 4 (OOPSLA): 1–29. doi:10.1145/3428222. S2CID 227044242.
  6. ^ a b Madsen, Magnus; Lhoták, Ondřej (13 November 2020). "Fixpoints for the Masses: Programming with First-class Datalog Constraints". Proceedings of the ACM on Programming Languages. 4 (OOPSLA): 125:1–125:28. doi:10.1145/3428193. S2CID 227107960.
  7. ^ Lucassen, J. M.; Gifford, D. K. (1988). "Polymorphic effect systems". Proceedings of the 15th ACM SIGPLAN-SIGACT Symposium on Principles of Programming Languages - POPL '88: 47–57. doi:10.1145/73560.73564. ISBN 0897912527. S2CID 13015611.
  8. ^ Leijen, Daan (5 June 2014). "Koka: Programming with Row Polymorphic Effect Types". Electronic Proceedings in Theoretical Computer Science. 153: 100–126. arXiv:1406.2061. doi:10.4204/EPTCS.153.8. S2CID 14902937.
  9. ^ a b "Programming Flix - Fixpoints". flix.dev.
  10. ^ Madsen, Magnus; Yee, Ming-Ho; Lhoták, Ondřej (August 2016). "From Datalog to flix: a declarative language for fixed points on lattices". ACM SIGPLAN Notices. 51 (6): 194–208. doi:10.1145/2980983.2908096.
  11. ^ Madsen, Magnus; Lhoták, Ondřej (2018). "Safe and sound program analysis with Flix". Proceedings of the 27th ACM SIGSOFT International Symposium on Software Testing and Analysis - ISSTA 2018: 38–48. doi:10.1145/3213846.3213847. ISBN 9781450356992. S2CID 49427988.
  12. ^ Keidel, Sven; Erdweg, Sebastian (10 October 2019). "Sound and reusable components for abstract interpretation". Proceedings of the ACM on Programming Languages. 3 (OOPSLA): 1–28. doi:10.1145/3360602. S2CID 203631644.
  13. ^ Gong, Qing. Extending Parallel Datalog with Lattice. Pennsylvania State University.
  14. ^ Yee, Ming-Ho (2016-09-15). Implementing a Functional Language for Flix. University of Waterloo.
  15. ^ "Monomorphise". mlton.org.
  16. ^ "Programming Flix - Interoperability". flix.dev.
  17. ^ Madsen, Magnus; Zarifi, Ramin; Lhoták, Ondřej (2018). "Tail call elimination and data representation for functional languages on the Java virtual machine". Proceedings of the 27th International Conference on Compiler Construction - CC 2018: 139–150. doi:10.1145/3178372.3179499. ISBN 9781450356442. S2CID 3432962.
  18. ^ Tauber, Tomáš; Bi, Xuan; Shi, Zhiyuan; Zhang, Weixin; Li, Huang; Zhang, Zhenrui; Oliveira, Bruno C. D. S. (2015). "Memory-Efficient Tail Calls in the JVM with Imperative Functional Objects". Programming Languages and Systems. Lecture Notes in Computer Science. 9458: 11–28. doi:10.1007/978-3-319-26529-2_2. ISBN 978-3-319-26528-5.
  19. ^ "Redundancies as Compile-Time Errors". flix.dev.
  20. ^ Engler, D. (October 2003). "Using redundancies to find errors". IEEE Transactions on Software Engineering. 29 (10): 915–928. doi:10.1109/TSE.2003.1237172.
  21. ^ "flix - Visual Studio Marketplace". marketplace.visualstudio.com.
  22. ^ "Programming Flix - Effects". flix.dev.
  23. ^ "Rust Internals - Flix Polymorphic Effects".
  24. ^ "The Flix API - List". api.flix.dev.
  25. ^ "The Flix API - Prelude". api.flix.dev.
  26. ^ Arntzenius, Michael; Krishnaswami, Neel (January 2020). "Seminaïve evaluation for a higher-order functional language". Proceedings of the ACM on Programming Languages. 4 (POPL): 1–28. doi:10.1145/3371090. S2CID 208305062.
  27. ^ Minker, Jack. Foundations of deductive databases and logic programming. Morgan Kaufmann.
  28. ^ "The Flix Programming Language - Principles". flix.dev. Retrieved 28 August 2020.
  29. ^ "Taming Impurity with Polymorphic Effects". flix.dev.

외부 링크