Haskell에서 값을 항목 및 중간 항목으로 렌더링

Dec 21 2020

사용자 인터페이스 프로그래밍을 수행하는 동안 값 목록을 렌더링하고 렌더링 된 값 사이에 관련 정보를 추가해야하는 경우가 종종 있습니다. 다음 코드 예제에서는 숫자 값을 괄호 안에 표시되는 문자열로 렌더링하고 두 값의 거리를 값 렌더링 사이에 배치되는 문자열로 렌더링합니다. 코드는 작동하지만 mystery함수 구현이 Haskell 표준 라이브러리의 일부로 제공 되는지 궁금합니다 . 사람이 읽을 수있는 단어를 사용하면 인터넷 검색이 더 쉬워 지므로 다른 라이브러리에서이 함수에 사용되는 이름에도 관심이 있습니다.

mystery :: (a -> b) -> (a -> a -> b) -> [a] -> [b]
mystery n d [] = []
mystery n d [x] = [n x]
mystery n d (x:xs) = (n x) : (d x (head xs)) : mystery n d xs

node x = "(" ++ show x ++ ")"
distance x y = "-" ++ (show $ abs $ x - y) ++ "-"
render xs = concat $ mystery node distance xs
-- render [25, 68, 54, 15] == "(25)-43-(68)-14-(54)-39-(15)"

답변

3 DDub Dec 21 2020 at 06:11

귀하의 mystery기능은 실제로 한 번에 몇 일을하고있다, 당신은 행동을 분리 할 경우에 무슨 일이 일어나고 있는지 확인하기 위해 좀 더 쉽게 할 수있다.

먼저 n모든 요소를 매핑 합니다. 우리는 그것을 fmap n xs. 다음으로, 당신은 새로운 요소를 구성하고 d x y인접한 모든 요소 쌍에 대한 x과를 y. 우리는 그것을 zipWith d xs (tail xs).

마지막 단계는이 두 가지 구조를 취하고 그들 사이를 번갈아 가며 번갈아 가며 새로운 목록을 만드는 것입니다. 흥미롭게도이 질문은 9 년 전 질문 이었지만 여전히 만족스러운 답변이 없습니다. 아마도 가장 간단한 대답은 자신의 함수를 정의하는 것입니다.

alternate [] ys = ys
alternate (x:xs) ys = x : alternate ys xs

그런 다음 mystery한 줄로 정의 할 수 있습니다 .

mystery n d x = alternate (fmap n x) (zipWith d x (tail x))

당신이 경우 실제로 는 한 - 라이너가되고 싶어요, 최고의 내가 사용하던 가지고 올 수 concattranspose펑키 방식의 비트에서 :

mystery n d x = concat $ transpose $ (pure $ fmap n x) <> (pure $ zipWith d x (tail x))

기본적으로 우리는를 사용하여 두 구성 요소에서 단일 목록을 만들고를 pure함께 융합 <>한 다음 transpose이 "목록 목록"을 사용하여 요소를 적절하게 산재 concat하고 결과를 표시합니다.