Resistance is futile, Resistors have been dispatched to model your Resistance
Guards

Using so many if then and else is really weird in Haskell, I suggest using the guards:

resistor_mania resistor target
    | resistor == target = (show resistor)
    | resistor &lt; target = (show resistor) ++ "+" ++ (resistor_mania resistor (target - resistor))
    | otherwise = (show resistor) ++ "||(" ++ (resistor_mania resistor (p_resistor resistor target)) ++ ")"


This is the standard way of listing mutually exclusive conditions in a function definition.

Semicolons

Haskell uses a two-dimensional syntax, semicolons are not needed and should be omitted as they convey no additional information, just noise.

Prefer mainstream function definitions

p_resistor = (\existing target -&gt; (1 / ((1 / target) - (1 / existing))))


Becomes:

p_resistor existing target = (1 / ((1 / target) - (1 / existing))))


That looks maybe less cool, but surely faster to understand.

Types


  the type-signature of resistor_mania makes me uneasy :/


Haskell is type-centric, so it is good that you are worrying about types.

I deleted your types and asked the compiler what types it would like for your functions. 

*Main&gt; :t p_resistor
p_resistor :: Double -&gt; Double -&gt; Double
*Main&gt; :t resistor_mania
resistor_mania :: Double -&gt; Double -&gt; String


I think these suggested types are simpler, and I would use them instead of your bulky type declarations.

Non-closing parenthesis

$ is like a parenthesis but you do not need to close it:

putStrLn $ show $ resistor_mania (read res_input) (read target_value)


This is somewhat subjective though...