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인 줄을 몰라서 그런 것 같다.)

 

let addToIntervals intervals n =
if (List.length intervals > 0) && n = (fst (List.head intervals)) - 1
then (n, (snd (List.head intervals))) :: (List.tail intervals)
else (n, n) :: intervals
let toIntervals nums =
List.fold addToIntervals [] (List.sortDescending nums)
// test
printfn "%A" (toIntervals [1;2;3;5;6;8])
view raw intervals.fsx hosted with ❤ by GitHub

 

 

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

import Data.List
addToIntervals intervals n =
if not (null intervals) && n == fst (head intervals) - 1
then (n, snd (head intervals)):tail intervals
else (n, n):intervals
toIntervals nums =
foldl addToIntervals [] (reverse $ sort nums)
-- test
main :: IO ()
main = do
print (toIntervals [1,2,3,5,6,8]) -- [(1,3),(5,6),(8,8)]
view raw intervals.hs hosted with ❤ by GitHub

'Programming' 카테고리의 다른 글

Functional programming languages: F# vs Haskell  (0) 2023.09.21
GHCi는 느리다.  (2) 2023.09.21
Java, C# Converter  (0) 2023.09.17
[C#] I wish I knew : RealProxy  (0) 2023.09.13
(C++) variant와 monostate  (0) 2023.09.07