Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
stanford-lambda.gitlab.io
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Locked Files
Issues
3
Issues
3
List
Boards
Labels
Service Desk
Milestones
Merge Requests
1
Merge Requests
1
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Packages
Packages
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
stanford-lambda
stanford-lambda.gitlab.io
Commits
6c2df9da
Commit
6c2df9da
authored
Feb 06, 2019
by
Adithya C. Ganesh
💬
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Add solutions for assign2
parent
e271a098
Pipeline
#46459302
passed with stages
in 5 minutes and 34 seconds
Changes
1
Pipelines
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
48 additions
and
0 deletions
+48
-0
assign2.markdown
solutions/assign2.markdown
+48
-0
No files found.
solutions/assign2.markdown
0 → 100644
View file @
6c2df9da
---
title
:
Assignment 2
---
## Problems
1.
Integers, like booleans, do not have a natural associative operation.
However, both addition and multiplication are associative operations on
integers. Write
`Semigroup`
instances for the
`Sum`
and
`Product`
types
wrapping
`Int`
in the starter code, mirroring the implementations of
`Any`
and
`All`
.
See code below.
2.
The default given above has $O(n)$ performance, which is less efficient than
the best general implementation. Using the associative property of
`<>`
,
provide a more efficient implementation,
`stimes'`
, with time
complexity $O(
\l
og n)$.
```haskell
stimes' :: (Semigroup a, Integral b) => b -> a -> a
stimes' n x
| n <= 0 = error "positive multiplier expected"
| n == 1 = x
| even n = stimes' m x <> stimes' m x
| otherwise = stimes' (m + 1) x <> stimes' m x
where m = n `div` 2
```
3.
While $O(
\l
og n)$ is the best possible performance in general, specific
instances can perform even better. Extend your instances for
`Sum`
and
`Product`
with $O(1)$ implementations of
`stimes`
.
```haskell
instance Semigroup Sum where
(Sum a) <> (Sum b) = Sum $ a + b
stimes n (Sum x)
| n <= 0 = error "positive multiplier expected"
| otherwise = Sum $ x * (fromIntegral n)
instance Semigroup Product where
(Product a) <> (Product b) = Product $ a * b
stimes n (Product x)
| n <= 0 = error "positive multiplier expected"
| otherwise = Product $ x ^ (fromIntegral n)
```
\ No newline at end of file
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment