Skip to content

Commit fec2e49

Browse files
ION606cjreed121
andauthored
[Feature:Autograding] Add Haskell image (#45)
### Please check if the PR fulfills these requirements: * [x] Tests for the changes have been added/updated (if possible) * [x] Documentation has been updated/added if relevant ### What is the current behavior? <!-- List issue if it fixes/closes/implements one using the "Fixes #<number>" or "Closes #<number>" syntax --> none ### What is the new behavior? we can now run haskell files ### Other information? <!-- Is this a breaking change? --> <!-- How did you test --> this is not a breaking change and I tested it using some simple files (I included an example below): ```haskell -- Function to compute the nth Fibonacci number fibonacci :: Integer -> Integer fibonacci n | n <= 0 = 0 | n == 1 = 1 | otherwise = fibonacci (n - 1) + fibonacci (n - 2) -- Function to compute the factorial of a given number factorial :: Integer -> Integer factorial 0 = 1 factorial n = n * factorial (n - 1) -- Function to check if a number is prime isPrime :: Integer -> Bool isPrime n | n <= 1 = False | n == 2 = True | otherwise = null [ x | x <- [2..isqrt n], n `mod` x == 0] where isqrt = floor . sqrt . fromIntegral -- Main function to test the above functions main :: IO () main = do putStrLn "Enter a number for Fibonacci calculation:" fibInput <- getLine let fibNumber = read fibInput :: Integer putStrLn ("Fibonacci number at position " ++ show fibNumber ++ " is " ++ show (fibonacci fibNumber)) putStrLn "\nEnter a number for factorial calculation:" factInput <- getLine let factNumber = read factInput :: Integer putStrLn ("Factorial of " ++ show factNumber ++ " is " ++ show (factorial factNumber)) putStrLn "\nEnter a number to check if it is prime:" primeInput <- getLine let primeNumber = read primeInput :: Integer putStrLn (show primeNumber ++ (if isPrime primeNumber then " is" else " is not") ++ " a prime number.") ``` --------- Co-authored-by: Chris Reed <[email protected]>
1 parent bdb8632 commit fec2e49

File tree

2 files changed

+47
-0
lines changed

2 files changed

+47
-0
lines changed
+44
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
# First Stage: Builder
2+
FROM debian:buster-slim AS builder
3+
4+
# Install necessary dependencies for building GHC
5+
RUN apt-get update \
6+
&& apt-get install -y --no-install-recommends \
7+
curl build-essential libffi-dev libgmp-dev libtinfo5 ca-certificates xz-utils \
8+
&& rm -rf /var/lib/apt/lists/*
9+
10+
# Install GHCup (Haskell toolchain manager) without automatically installing the latest GHC
11+
RUN curl --proto '=https' --tlsv1.2 -sSf https://get-ghcup.haskell.org | bash -s -- -y --no-ghc \
12+
&& /root/.ghcup/bin/ghcup install ghc 8.10.7 \
13+
&& /root/.ghcup/bin/ghcup set ghc 8.10.7 \
14+
&& rm -rf /root/.ghcup/ghc/9.4.8
15+
16+
# Clean up unnecessary build artifacts and cache
17+
RUN rm -rf /root/.ghcup/cache /var/lib/apt/lists/*
18+
19+
20+
# Second Stage: Final Image
21+
FROM debian:buster-slim
22+
23+
# Install runtime dependencies
24+
RUN apt-get update \
25+
&& apt-get install -y --no-install-recommends \
26+
libffi6 libgmp10 libtinfo5 build-essential \
27+
&& rm -rf /var/lib/apt/lists/*
28+
29+
# Copy GHC from the builder stage
30+
COPY --from=builder /root/.ghcup /root/.ghcup
31+
32+
# Set PATH to include GHCup
33+
ENV PATH="/root/.ghcup/bin:${PATH}"
34+
35+
# Set the working directory
36+
WORKDIR /usr/src/app
37+
38+
# Install libgmp-dev explicitly for runtime linking
39+
RUN apt-get update \
40+
&& apt-get install -y --no-install-recommends libgmp-dev \
41+
&& rm -rf /var/lib/apt/lists/*
42+
43+
# Default command to keep the container running
44+
CMD ["/bin/bash"]

dockerfiles/haskell/metadata.json

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
"pushLatest": false
3+
}

0 commit comments

Comments
 (0)