Forumet - Haskell är manligt!

Haskell är manligt!

1185 0 38
Jag vill bara göra alla uppmärksamma på att Haskell är ett otroligt manligt och tufft programspråk. Följande kod är ett litet lekprogram jag skrivit som övning. Det är ett enkelt wordfilter som byter ut alla fula ord i en mening mot motsvarande fina ord.
module Main where

main = print ( censor "Is this loli ? I think my penis just exploded."
["CP", "loli", "penis"] ["Chris Hansen", "duck", "PONOS"] )

-- censor
-- Söker igenom str efter ord som förekommer i bad och ersätter dem med
-- motsvarande ord från good.
censor :: String -> [String] -> [String] -> String
censor str bad good = unwords [replaceBad w bad good | w <- words str]

-- replaceBad
-- Om word finns i listan bad returneras motsvarande ord ur listan good,
-- annars returneras ordet som det är.
replaceBad :: String -> [String] -> [String] -> String
replaceBad word (bad:[]) (good:[]) = if (word == bad) then good else word
replaceBad word (bad:badL) (good:goodL) =
if word == bad
then good
else replaceBad word badL goodL


Plockar vi bort alla typdeklarationer och kommentarer får vi:
module Main where

main = print ( censor "Is this loli ? I think my penis just exploded."
["CP", "loli", "penis"] ["Chris Hansen", "duck", "PONOS"] )

censor str bad good = unwords [replaceBad w bad good | w <- words str]

replaceBad word (bad:[]) (good:[]) = if (word == bad) then good else word
replaceBad word (bad:badL) (good:goodL) =
if word == bad
then good
else replaceBad word badL goodL


Fantastiskt! Ett wordfilter på <10 rader kod! Sug på den, Python!

Någon annan på forumet (förutom CUBERT_IS_BACK) som utsatts för Haskell?

EDIT: för den som undrar så printar koden ut "Is this duck ? I think my PONOS just exploded." när den körs.

Spana också in:

imponerande ;)insåg också nu att det var ca 1003231 miljarder år sedan jag rörde python senast
motsvarande kod i java för jämförelse

package test;
public class Main {
static String censur(String text, String[] bad,String[] good) {
for (int i = 0; i < good.length; i++) {
text=text.replace(" "+ bad+ " "," " +good+" ");
}
return text;
}
public static void main(String[] args) {
String[] bad= {"lol","omfg"};
String[] good={"Laughting out load","o my fucking god"};
System.out.println(censur(" omfg im lol ",bad,good));
}
}
KID_IS_BACK:

[cry]


Jag gissar att du fattat monads, alltså :) jag skrev en BF-interpreter, men sen orkade jag inte mer. För små program så är det dock nice... Exempelvis så hade jag hellre använt haskell än ruby då din kod är lite elegantare (jag försökte nu inte skriva bra kod, så beware):


filter = { 'loli' => "arne dahl", 'penis' => 'mangyna', 'bajs' => "skit" }
mening = "loli ! Min penis luktar bajs".split(' ').collect { |s|
if filter.has_key?(s)
s = filter[s]
else s
end
}
mening = mening.join(" ")


jag försökte mig på nåt rekursivt, men det var inte så snyggt i ruby... alls.
KID_IS_BACK:

Fantastiskt! Ett wordfilter på <10 rader kod! Sug på den, Python!


Utan tvekan är head::tail rekursion nice i haskell. Ta till exempel och skriv en icke-obfuscated rot13-roterare i typ java och haskell... det är inte så svårt att gissa vilken som blir mest elegant.

public String rot13(String s) {

char[] a = s.toCharArray();
for(int i = 0; i<a.length;i++) {
if((a>='a'&& a<='m') || (a>'A'&&a<'M')) {
a+=13;
} else if((a>='n'&& a<='z') || (a>'N'&&a<'Z')) {
a-=13;
}
}
return new String(a);
}


mot en läsbar, men med all säkerhet inte det kortaste:


rot13Char x | (ord 'a' <= ord(toLower x)) && (ord(toLower x) <= ord 'm') = chr(ord x+13)
| (ord 'n' <= ord(toLower x)) && (ord(toLower x) <= ord 'z') = chr(ord x-13)
| otherwise = x

rot13 s = map rot13Char s


Pattern matching = [love]
KID_IS_BACK:

Någon annan på forumet (förutom CUBERT_IS_BACK) som utsatts för Haskell?


Läste en kurs om det för ett år sen ungefär, fast jag har inte riktigt haft tid att fördjupa mina kunskaper inom det. Riktigt nice faktiskt. Verkar svårt att göra något vettigt med det dock.