Я хочу сделать функцию игрушку, которая производит Maybe a
, а затем поднять show
, чтобы сделать его Maybe String
, но результат был странно для меня:Что делать различие между `: T` и пусть выражение в GHCi
λ> :t liftM show . Just
liftM show . Just :: Show a1 => a1 -> Maybe String
λ> liftM show . Just $ 10
Just "10"
λ> let f = liftM show . Just
λ> f 10
<interactive>:9:3:
No instance for (Num()) arising from the literal `10'
Possible fix: add an instance declaration for (Num())
In the first argument of `f', namely `10'
In the expression: f 10
In an equation for `it': it = f 10
λ> :t f
f ::() -> Maybe String
λ> let g = liftM show . Just :: (Show a) => a -> Maybe String
λ> :t g
g ::() -> Maybe String
λ> let h = liftM show . Just :: Int -> Maybe String
λ> :t h
h :: Int -> Maybe String
Я предполагаю, что это имеет какое-то отношение умозаключения типа, но я действительно не знаю, что случилось:
- откуда это таинственное
()
взялось? - Почему GHCi не жаловался на двусмысленность?
возможно дубликат [foldr против использования foldr1 в Haskell] (http://stackoverflow.com/questions/18661866/foldr-vs-foldr1-usage-in-haskell) –