You’re pretty much right on the money. In Haskell, a String is a type synonym for [Char], so we can use the list concatenation function ++ to join strings. ++ is an infix function i.e. [1,2,3] ++ [3,4,5] = [1,2,3,3,4,5] (which will be equivalent to doing (++) [1,2,3] [3,4,5] by virtue of how infix functions work in Haskell). When we do (++ “a”), we create a partially applied function. Now, we can supply another string to it and it will add “a” at the end of it.
iterate f x produces a lazily evaluated sequence [x, f x, f f x, …]. So, to get the nth entry, we can do wine !! n where we use another infix function !!. With partial application, we can modify the definition of wine to create a function that takes an Int n and spits out the nth entry of it by doing
<span style="color:#323232;">wine </span><span style="font-weight:bold;color:#a71d5d;">= </span><span style="font-weight:bold;color:#795da3;">(!!) </span><span style="font-weight:bold;color:#a71d5d;">$</span><span style="color:#323232;"> iterate (</span><span style="font-weight:bold;color:#a71d5d;">++</span><span style="color:#183691;">" Is Not an Emulator"</span><span style="color:#323232;">) </span><span style="color:#183691;">"WINE"
</span>
We needed to wrap the !! inside parentheses because it’s an infix function. $ just changes the order of application. (IIRC, it’s the least significant function.) You can think that we’re wrapping whatever’s on the right of the $ by parentheses. Now we can do wine 2 instead of wine !! 2 to get “WINE Is Not an Emulator Is Not an Emulator”.
I’m by no means a Haskell expert. (I’m not even a professional programmer lol.) So, if someone would like to add some more details, they’re more than welcome.
Edit: A much more readable version might be
<span style="color:#323232;">wine 0 = "WINE"
</span><span style="color:#323232;">wine n = wine (n-1) ++ " Is Not an Emulator"
</span>