Проблема в том, что ваш фильтр делает невозможным создание каких-либо решений. Чтобы сгенерировать строку длиной 4
, сначала необходимо сгенерировать строку длиной 3
, поскольку каждый раз перед ней добавляется один символ. Чтобы сгенерировать список длиной 3
, он должен будет генерировать строки длиной 2
и т. Д. До базового случая: пустой строки.
Это не сам фильтрэто главная проблема, проблема в том, что вы фильтруете таким образом, что выдача значений теперь невозможна.
Мы можем исправить это, используя другой список, который будет создавать строки, и фильтровать этот список следующим образом:
allStrings = filter ((==) 4 . length) vals
where vals = [x | x <- [ c : s | s <- "" : vals, c <- "RTP"]]
Это создаст все списки длиной 4
, а затем застрянет в бесконечном цикле, поскольку filter
будет продолжать поиск других строк и не сможет их найти.
Однако мы можем добиться большего успеха, например, используя replicateM :: Monad m => Int -> m a -> m [a]
здесь:
Prelude Control.Monad> replicateM 4 "RTP"
["RRRR","RRRT","RRRP","RRTR","RRTT","RRTP","RRPR","RRPT","RRPP","RTRR","RTRT","RTRP","RTTR","RTTT","RTTP","RTPR","RTPT","RTPP","RPRR","RPRT","RPRP","RPTR","RPTT","RPTP","RPPR","RPPT","RPPP","TRRR","TRRT","TRRP","TRTR","TRTT","TRTP","TRPR","TRPT","TRPP","TTRR","TTRT","TTRP","TTTR","TTTT","TTTP","TTPR","TTPT","TTPP","TPRR","TPRT","TPRP","TPTR","TPTT","TPTP","TPPR","TPPT","TPPP","PRRR","PRRT","PRRP","PRTR","PRTT","PRTP","PRPR","PRPT","PRPP","PTRR","PTRT","PTRP","PTTR","PTTT","PTTP","PTPR","PTPT","PTPP","PPRR","PPRT","PPRP","PPTR","PPTT","PPTP","PPPR","PPPT","PPPP"]
Обратите внимание, что здесь сначала используется символ last меняется, когда мы генерируем следующую строку. Я оставляю это как упражнение для получения обратного результата.