信号の信号の問題
の問題は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