Programming

F#과 Haskell의 type inference 비교

steloflute 2023. 9. 21. 23:17

F#의 type inference는 Haskell을 쓸 때보다 주의할 점이 있다.

 

 

예제로, 수 목록을 구간 목록으로 변환하는 프로그램을 작성해보았다.

 

F#에서는 이렇게 리스트에 대해 .[0]을 사용하면 타입 선언 없이는 컴파일되지 않는다:

let addToIntervals (intervals: (int * int) list) (n: int) =
    if not intervals.IsEmpty && n = (fst intervals.[0]) - 1
        then (n, (snd intervals.[0])) :: (List.tail intervals)
        else (n, n) :: intervals

let toIntervals (nums: int list) =
    List.fold addToIntervals [] (List.sortDescending nums)

// test
let numbers = [1;2;3;5;6;8]
printfn "%A" (toIntervals numbers)

 

List.head를 .[0] 대신 사용하면 잘 된다. (.[0]은 앞의 대상이 List인 줄을 몰라서 그런 것 같다.)

 

 

 

Haskell에서는 이렇게 타입 선언 없이 잘 된다: