>

Haskell을 처음 사용합니다. Haskell 코드가 매우 우아하다는 블로그를 읽었습니다. 하스켈 코드를 작성하는 방식은 전혀 우아하지 않습니다. 개선하고 싶은 분야 중 일부는

  • 어떤 값이든 대소 문자를 사용하여 다음과 같은 것을 사용하고 있습니다. fromRight from Data. 더 나은 옵션이 있습니까? 올바른 값을 위해 중첩 구조가있는 코드도 있습니다.

    case eitherResponse of
        Right response -> return $ toJSON $ response
        Left msg -> Log $ "Error" <> msg
    
    

  • 이런 코드가 많이 있습니다

    fname <- URI.mkPathPiece functionname
    kch <- URI.mkPathPiece $ T.pack "channel"
    vch <- URI.mkPathPiece channel
    kca <- URI.mkPathPiece $ T.pack "chaincode"
    vca <- URI.mkPathPiece chaincode
    let path = Just (True, Data.List.NonEmpty.fromList [fname, kch, vch, kca, vca])
    
    

내 모습이 마음에 들지 않습니다. 어떻게 개선 할 수 있습니까?

또한 Haskell은 "do"블록의 명령형 프로그래밍과 매우 유사합니다. 하스켈 코드가 어떻게 보입니까, 아니면 잘못된 길로 가고 있습니까?

  • 답변 # 1

    두 번째 예를 다음과 같이 개선 할 수 있습니다 :

    pieces <- traverse URI.makePathPiece $ 
       NonEmpty.fromList [functionName, "channel", channel, "chaincode", chaincode]
    let path = Just (True, pieces)
    
    

    우리는 T.pack 를 생략 {-# OverloadedStrings #-} 를 사용하여  신장. 그런 다음 traverse 를 사용하십시오.   NonEmpty 를 통해 모나 딕 함수를 매핑 통과 가능한 컨테이너입니다.

    첫 번째 예제에 대한 구체적인 대안을 제시하기 위해 더 많은 컨텍스트가 필요하지만 다음과 같은 중첩 구조가있는 경우 :

    case eitherResponse of
        Left -> some error ...
        Right x -> 
            case someFunction x of
                Left -> some error ...
                Right y -> ...
    
    

    이런 종류의 체인은 정확히 Either 입니다. / ExceptT Monad  인스턴스는 않습니다. 다음과 같이 만들 수 있습니다 :

    do x <- eitherResponse
       y <- someFunction x
    
    

    모나드 변압기에 대해 배울 시간입니다!

  • 답변 # 2

    하위 기능의 도우미 기능으로이 부분을 조금만 향상시킬 수 있다고 생각합니다 :

    toJsonOrError (Right response) = return $ toJSON $ response
    toJsonOrError (Left msg) = Log $ "Error" <> msg
    
    

    또한 다음과 같이 Data.List.NonEmpty.fromList를 대체하기 위해 @Ripointed로 한정자를 가져올 수 있습니다.

    import qualified Data.List.NonEmpty as NonEmpty (fromList)
    
    

    라인을 단순화하려면 :

    Just (True, fromList [fname, kch, vch, kca, vca])
    
    

    나머지 코드는 do 입니다.  표기법 및 개선 될 수없는 것처럼 보입니다 (표시 된 코드와 비교하여)

  • 이전 rails 5의 before_destroy 콜백 throw ( - abort) 및 레코드 수정
  • 다음 intellij idea - 코 틀린 - dsl 색상 스타일