Помните, что списки - это монады в haskell с определением:
instance Monad [] where
m >>= f = concatMap f m
return x = [x]
fail s = []
Итак, если вы берете свой код, который выглядит примерно так:
do {ln <- lines "hello, world"; ln!!0}
Это эквивалентно следующему с использованием нотации связывания:
lines "hello world" >>= (\ln -> ln!!0)
или более кратко:
lines "hello world" >>= (!!0)
Теперь мы можем использовать определение монады списка, чтобы переписать это следующим образом:
concatMap (!!0) (lines "hello, world")
Что эквивалентно:
concat $ map (!!0) (lines "hello, world")
строки "hello, world" вернутся ["hello, world"], поэтому отображение (!! 0) на него приведет к строке "h". Это имеет тип [Char], но для concat требуется тип [[t]]. Char не соответствует [t], следовательно, ошибка.
Попробуйте использовать let или что-то, а не делать запись.
Edit:
Так что я думаю, это то, что вы хотите, используя пусть, а не делать.
run :: String -> String
run s = let ln = lines s
seq = ln!!0
states = ln!!1
l1 = listDouble (ln!!2)
l2 = listDouble (ln!!3)
tr1 = readDouble (ln!!4)
tr2 = readDouble (ln!!5)
in show $ maximumInd (scoreFunction seq (length seq) l1 l2 tr1 tr2)