하스켈이 좋아하는 곳.
프로그래밍 언어인 Haskell이 좋아하는 부분을 정리해 보았다.
이 기사를 계기로 하스켈에게 관심이 생겼으면 좋겠다.
유형 시스템
Haskell은 강력한 정적 템플릿 언어이다.정적 유형 언어의 장점은 컴파일할 때 유형 검사를 하고 프로그램을 실행하기 전에 오류를 발견할 수 있다는 것이다.
예를 들어 대표적인 동적 유형 언어 루비를 쓴 사람은 다음과 같은 오류를 본 적이 있을 것이다.
undefined method 'hoge' for nil:NilClass
호출 방법 hoge
의 대상이 nil
이면 이 오류가 발생합니다.실행할 때 방법을 호출하려는 순간을 알 수 없습니다. 대상은 nil
입니다.다른 한편, 정적 유형 언어인 Haskell은 사전에 형 검사를 하고 프로그램에 문제가 있으면 실행하기 전에 형 오류로 표시됩니다.동작 확인과 테스트를 하고 오류를 발견하는 것보다 컴파일할 때, 즉 실행 전에 눈치채는 것이 효율적이지 않을까 생각합니다.
정확하게 포맷된 프로그램의 안전성이 수학적으로 증명되었기 때문에 언제 오류가 발생할지 모르는 동적 유형 언어보다 정적 유형 언어가 안심하고 프로그래밍을 할 수 있다는 것도 내가 좋아하는 요점이다.이 증명서에 관해서는 책'형 시스템 입문'등 상세한 설명이 쓰여 있으니 마음에 드시면 읽어 주십시오.
하스켈을 쓸 때 유형에 맞지 않는 프로그램을 썼고 컴파일할 때도 오류가 있었다.하지만 그때 드러난 잘못도 이해하기 쉽다.예를 들어, Haskell은 다음 유형의 오류를 표시합니다.
<interactive>:10:23: error:
* Couldn't match expected type `Ordering' with actual type `Char'
* In the expression: 'a'
In the expression: if x > 1 then GT else 'a'
In an equation for `it': it = if x > 1 then GT else 'a'
이 오류는 "Ordering
쓰기 원하는 값Char
형'a'
이 왔다"는 오류입니다.읽기 쉬워요.또한 오류 컴파일을 수정할 때 퍼즐의 마지막 조각이 끼워 넣은 것처럼 쾌감을 얻을 수 있기 때문에Haskell의 유형 시스템을 좋아합니다.
점 스타일 없음
Haskell은 순수함수형 언어다.모든 문법이 간단하기 때문에 나는 아주 적은 행수로 함수를 정의하는 것을 좋아한다.여기서 특별히 좋아하는 포인트의 자유를 소개합니다.
무점 스타일은 매개변수를 사용하지 않고 함수 작성을 사용하여 함수를 정의하는 스타일입니다.예를 들어 다음 함수를 무점 함수로 변환합니다.
sumOdds xs = sum (filter odd xs)
우선 함수를 합성한 연산자.
를 사용하여 다음과 같이 다시 쓴다.sumOdds xs = (sum . filter odd) xs
왼쪽과 오른쪽이 나타났다xs
.Haskell은 이 xs
를 생략하고 다음 함수를 정의할 수 있습니다.sumOdds = sum . filter odd
sumOdds
는filter odd
(목록에서 홀수만 필터),sum
(계산 목록의 총계)이다.아주 간단하면서도 아름다워요.위에서 말한 바와 같이 점자유식은 매우 좋은 함수 정의 방법으로 복잡한 함수를 억지로 무점으로 설정하면 가독성이 떨어지기 때문에 함부로 사용하지 않도록 해야 한다.예를 하나 더 봅시다.
f x y = (x + 1) * (y + 1)
이 함수를 점 없음 스타일로 변환:.f = (. (1 +)) . (*) . (1 +)
나는 무슨 함수인지 모른다.이런 상황에서 원래의 정의는 쉽게 읽을 수 있기 때문에 무적분은 필요 없다.(하지만 복잡한 함수에 대해 무득점으로 어떻게 전환하는지는 흥미롭다.)모나드
하스켈 하면 모나드야.모형은 추상도가 높고 인상이 어려운 개념이지만 자유자재로 다양한 응용 프로그램을 더욱 안전하게 개발할 수 있다.여기에 모나드의 설명을 생략하고 몇 개의 모나드와 그 예를 소개한다.
모나드는 각양각색의 종류가 있다.모든 모델은 계산으로 하여금 각양각색의 상하문을 가지게 할 수 있다.
increment :: State Int ()
increment = do
s <- get
put (s + 1)
main :: IO ()
main = do
name <- getLine
putStrLn ("My name is " ++ name)
increment
형Int
형의 상태get
에서 이 값put
을 꺼내 상태를 바꾼다.다른 한편main
에서getLine
는 표준 입력으로부터의 입력을 받아들이고putStrLn
는 문자열을 표준 출력으로 출력한다.이렇게 보면 차이가 별로 없지만 실행하는 내용은 완전히 다르다.서로 다른 모나드도 같은 기술을 할 수 있고, 한 번 쓰는 것을 기억하면 다른 모나드도 사용할 수 있다.또
increment
에서는 사용할 수 없다getLine
.마찬가지로 main
에서도 사용할 수 없다get
.하려면, 유형 오류가 발생하여 실행할 수 없습니다.이렇게 형식적으로 가능한 조작을 제한하면 서로 다른 상하문을 잘못 조작하는 것을 방지하고 오류를 줄일 수 있다는 것도 모나드의 장점이다.Monad Transformer와 Extensible Effects에 따라 구현하려는 응용 프로그램의 컨텍스트에 따라 여러 모델을 조합할 수도 있습니다.
하스켈은 입문부터 모나드를 이해하기까지 길이 멀지만, 모나드를 이해할 수 있다면 하스켈로 다양한 프로그램(웹 앱 등)을 쓸 수 있어 하스켈의 매력을 엿볼 수 있다.
최후
저도 Template Haskell이나 프로그래머 같은 말을 하고 싶었는데 요즘은 기본적으로 Haskell을 쓰지 않아서 설명을 잘 못해서 포기했어요.언제 쓰고 싶은데요?
이번에 하스켈이 좋아하는 부분에 대해 썼는데, 물론 하스켈도 단점과 과제가 있었다.하지만 그걸 뛰어넘는 장점과 매력이 있다고 믿습니다.
이 기사를 계기로 하스켈에게 관심이 생겼으면 좋겠다.
Reference
이 문제에 관하여(하스켈이 좋아하는 곳.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/wataru86/items/f37d2ad0e9a7eee5b983텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)