1

私は Elm の初心者で、実験として、文字列を一度に 1 文字ずつ一定の速度で表示しようとしています。これだけ私はすでに達成しました。ただし、プログラムが文末文字 (ピリオド、疑問符、interrobang など) に到達するたびに、出力に短い一時停止を導入したいと思います。ただし、この一時停止を発生させる方法がわかりません。

これは私が持っている作業コードです(もちろん一時停止を差し引いたものです):

import Time (..)
import Signal (..)
import Text (..)
import String

stringOut : String -> Float -> Signal String
stringOut str rate = let 
    t = round <~ (foldp (+) 0 <| (flip (/) rate) <~ fps 60)
  in flip String.left str <~ t

main = asText <~ stringOut "This is a string. Yeah?" (20*millisecond)

私の最初の考えは、Time モジュールで遅延関数を使用する必要があるということですが、最終的にSignal Signal Int. どんな助けでも大歓迎です。ありがとう!

4

1 に答える 1

1

信号の信号の問題

の問題はSignal (Signal x)通常、s を返す関数の使用または定義に起因しますSignal。一般的なものは避けた方が無難です。

問題と解決策

さて、私があなたの目的のシステムを正しく理解していれば、静的なテキスト、特定の速度で刻むカウンター、ティックごとにテキストの新しい文字が表示されるはずですが、特定の文字で文の終わりを示します一時停止する必要があります。

タイムティックは、プログラムへの基本的な入力です。テキストのどこまで進んでいるか以上のことを数えている場合は、一時停止を導入できます。一時停止しているかどうか、どのくらい停止しているかを追跡する必要があります。一時停止を設定したセンテンスの最後に到達するたびに、すべてのティックが一時停止を食い尽くし、テキストへのオフセットを継続します。

コード

これは少しやり過ぎかもしれませんが、プログラムの入力と状態を形式化し、一般的にスケーラブルなスタイルで記述しました。

import Time
import Time (Time)
import Signal
import Signal (Signal, (<~))
import Text (asText)
import String
import List
import Graphics.Element (Element)

type alias Input = ()
type alias State = { text : String, offset : Int, delay : Int }

initialState : State
initialState = { text = "This is a string. Yeah?", offset = 0, delay = 0 }
stdRate : Time
stdRate = 50 * Time.millisecond
stdDelay : Int
stdDelay = 5
endOfSentence : List String
endOfSentence = [".", "?", "!"]

input : Signal Input
input = always () <~ Time.every stdRate

state : Signal State
state = Signal.foldp (always step) initialState input

step : State -> State
step state =
  let
    newChar = String.slice state.offset (state.offset+1) state.text
  in
    if| state.delay > 0 -> { state | delay <- state.delay-1 }
      | List.member newChar endOfSentence ->
        { state | offset <- state.offset + 1, delay <- stdDelay }
      | otherwise -> { state | offset <- state.offset + 1 }

view : State -> String
view { text, offset } = String.left offset text

main : Signal Element
main = asText << view <~ state
于 2015-02-14T15:26:26.080 に答える