那是因为 m 在本地类型签名是新的类型变量,所以他们承诺使用 任何 单子。如果你使用 display , eval 只能为特定的monad工作 display 使用。如果你a)删除本地类型签名,或b)带来类型变量,它应该工作 m 进入范围
m
display
eval
{-# LANGUAGE ScopedTypeVariables #-} ... interpret :: forall m. (Int -> m ()) -> Elo a -> Int -> m a