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인 줄을 몰라서 그런 것 같다.)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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]) |
Haskell에서는 이렇게 타입 선언 없이 잘 된다:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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)] |
'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 |