Haskell에서 입력 데이터의 유효성을 검사하는 관용적 인 방법은 응용 체인을 이용하는 것 같습니다.
mkMyData :: a -> b -> c -> Maybe MyData
mkMyData x y z =
MyData
<$> validateA x
<*> validateB y
<*> validateC z
여기서 유효성 검사 함수 자체가 Maybe
값을 반환 합니다. 내 스마트 생성자를 mkMyData
더 유연 하게 만들기 위해 MonadThrow
. 그건,
mkMyData :: MonadThrow m => a -> b -> c -> m MyData
MonadThrow
대신 각 유효성 검사 함수를 반환해야합니까 Maybe
? 아니면 응용 구조를 깨뜨리고 코드를 크게 복잡하게 만들지 않고 Maybe
각 유효성 검사 의 특정 결과를보다 일반적인 것으로 변환 할 수있는 방법이 MonadThrow
있습니까?
아니면 다르게 넣을까요? MonadThrow
더 복잡하고 덜 관용적 인 코드를 희생하면서 기본 라이브러리 함수에서 더 일반적인 반환 유형 을 위해 노력하는 것이 가치가 있습니까?
이것에 대한 답은 마지막 질문 과 동일 합니다 . 새 유효성 검사 기능에 대해 제안하는 유형,
mkMyData :: MonadThrow m => a -> b -> c -> m MyData
모나드가 물건을 던지는 방법이있는 한 모든 모나드에서 전혀 작동 할 수 있음을 의미합니다. 해당 함수의 구현이 명시 적으로 반환 Nothing
하거나 Just
결과 를 반환 할 수 있는지에 의존하는 경우 해당 조건을 충족하지 않습니다.
대신 Maybe a
MonadThrow에 의존 하도록 현재 반환되는 함수를 다시 작성해야합니다 . 예를 들어, 대신
validateA :: a -> Maybe t
validateA x | acceptable x = Just $ convert x
| otherwise = Nothing
당신은 써야 할 것입니다
validateA :: MonadThrow m => a -> m t
validateA x | acceptable x = pure $ convert x
| otherwise = throwM $ problemWith x
( x
인수로 취하는 모든 기능 이 구성되어 도메인과 관련이 있어야 함).
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다