최근에 저는 Haskell에서 프로그래밍을하는 방법을 알아 내려고합니다.
간단한 작업을하려고합니다. 지금은이 예제와 같은 작업을하고 있습니다.
input = [1,2,3,4]
output = [1,2,2,3,3,3,4,4,4,4]
즉, 각 요소 x
에 input
생성 x
요소 x
의이 output
. 따라서 1
입력 요소 의 경우 출력에 추가하십시오 [1]
. 그런 다음 2
입력의 요소에 [2,2]
대해 출력에 요소 를 추가합니다 . 그런 다음 element 3
, append [3,3,3]
등의 경우 알고리즘은 표준 숫자에서만 작동해야합니다.
나는 그것이 매우 쉽고 "정상적인"명령형 프로그래밍에서 그것을 수행하는 것은 사소한 일이라는 것을 알고 있지만, Haskell의 함수는 stateless이기 때문에 이에 접근하는 방법에 문제가 있습니다.
누구든지 Haskell 초보자가 어떻게 대처할 수 있는지 힌트를 줄 수 있습니까?
방금 모나드를 발견하셨습니다!
수행중인 작업에 대한 일반적인 아이디어는 다음과 같습니다.
각각의 a
입력에 - 요소 (컨테이너 형이다 M a
여기, [a]
), 당신은 완전히 새로운 컨테이너를 지정합니다 M b
. 그러나 최종 결과로 하나의 "평면"컨테이너 만 필요 M b
합니다.
자, Monad
유형 클래스 의 정의를 살펴 보겠습니다 .
class (Applicative m) => Monad m where
return :: a -> m a
(>>=) :: m a -> (a -> m b) -> m b
정확히 필요한 것입니다. 그리고 목록은의 인스턴스 Monad
이므로 다음과 같이 작성할 수 있습니다.
replicates :: [Int] -> [Int]
replicates l = l >>= \n -> replicate n n
또는 다음과 같이 작성할 수 있습니다.
replicates l = do
n <- l
replicate n n
이해하기 쉬운 목록 이해력을 아는 것이 흥미로울 수 있습니다.
replicates l = [ n | n <- l, _ <- [1..n] ]
chi가 제안한 것처럼 실제로는 다른 모나드 표현식에 대한 구문 설탕입니다.
[ n | n <- l, _ <- [1..n] ] ≡ l >>= \n -> [1..n] >>= \_ -> return n
... 또는 적어도 이전 버전의 GHC에 있었지만 이제는 더 최적화 된 목록 이해 구현을 사용한다고 생각합니다. 여전히 -XMonadComprehensions
플래그를 사용하여 탈당 변형을 켤 수 있습니다 .
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다