Agda: parse a string with numbers

前端 未结 3 1971
渐次进展
渐次进展 2021-01-13 12:19

I am trying to parse a string with natural numbers in Agda. e.g., the result of stringListToℕ \"1,2,3\" should be Just (1 ∷ 2 ∷ 3 ∷ [])

My

3条回答
  •  情歌与酒
    2021-01-13 12:35

    Here is the Code from Vitus as a running example that uses the Agda Prelude

    module Parse where
    
    open import Prelude
    
    -- Install Prelude
    ---- clone this git repo:
    ---- https://github.com/fkettelhoit/agda-prelude
    
    -- Configure Prelude
    --- press Meta/Alt and the letter X together
    --- type "customize-group" (i.e. in the mini buffer)
    --- type "agda2"
    --- expand the Entry "Agda2 Include Dirs:"
    --- add the directory 
    
    
    
    open import Data.Product using (uncurry′)
    open import Data.Maybe using ()
    open import Data.List using (sequence)
    
    splitBy : ∀ {a} {A : Set a} → (A → Bool) → List A → List (List A)
    splitBy {A = A} p = uncurry′ _∷_ ∘ foldr step ([] , [])
      where
        step : A → List A × List (List A) → List A × List (List A)
        step x (cur , acc) with p x
        ... | true  = x ∷ cur , acc
        ... | false = []      , cur ∷ acc
    
    
    charsToℕ : List Char → Maybe ℕ
    charsToℕ []   = nothing
    charsToℕ list = stringToℕ (fromList list)
    
    notComma : Char → Bool
    notComma c = not (c == ',')
    
    -- Finally:
    
    charListToℕ : List Char → Maybe (List ℕ)
    charListToℕ = Data.List.sequence Data.Maybe.monad ∘ map charsToℕ ∘ splitBy     notComma
    
    stringListToℕ : String → Maybe (List ℕ)
    stringListToℕ = charListToℕ ∘ toList
    
    
    -- Test
    
    test1 : charListToℕ ('1' ∷ '2' ∷ ',' ∷ '3' ∷ []) ≡ just (12 ∷ 3 ∷ [])
    test1 = refl
    
    test2 : stringListToℕ "12,33" ≡ just (12 ∷ 33 ∷ [])
    test2 = refl
    
    test3 : stringListToℕ ",,," ≡ nothing
    test3 = refl
    
    test4 : stringListToℕ "abc,def" ≡ nothing
    test4 = refl
    

提交回复
热议问题