List comprehensions: Difference between revisions

→‎{{header|AppleScript}}: Updated primitives
m (→‎{{header|Haskell}}: (Added a type signature))
(→‎{{header|AppleScript}}: Updated primitives)
Line 175:
 
{{trans|JavaScript}}
 
<lang AppleScript>-- List comprehension by direct and unsugared use of list monad
 
Line 181 ⟶ 180:
on pythagoreanTriples(maxInteger)
script X
on lambda|λ|(X)
script Y
on lambda|λ|(Y)
script Z
on lambda|λ|(Z)
if X * X + Y * Y = Z * Z then
unit([X, Y, Z])
Line 191 ⟶ 190:
[]
end if
end lambda|λ|
end script
bind(Z, rangeenumFromTo(1 + Y, maxInteger))
end lambda|λ|
end script
bind(Y, rangeenumFromTo(1 + X, maxInteger))
end lambda|λ|
end script
bind(X, rangeenumFromTo(1, maxInteger))
end pythagoreanTriples
 
-- TEST -----------------------------------------------------------------------
 
on run
-- Pythagorean triples drawn from integers in the range [1..n]
Line 213 ⟶ 212:
pythagoreanTriples(25)
--> {{3, 4, 5}, {5, 12, 13}, {6, 8, 10}, {7, 24, 25}, {8, 15, 17}, {9, 12, 15}, {12, 16, 20}, {15, 20, 25}}
-- {9, 12, 15}, {12, 16, 20}, {15, 20, 25}}
end run
 
Line 228 ⟶ 227:
-- concat :: a -> a -> [a]
script concat
on lambda|λ|(a, b)
a & b
end lambda|λ|
end script
Line 243 ⟶ 242:
 
 
----------------- GENERIC FUNCTIONS ----------------------------------------------------------
 
-- rangeenumFromTo :: Int -> Int -> [Int]
-- GENERIC LIBRARY FUNCTIONS
on rangeenumFromTo(m, n)
if n < m then
set d to -1
else
set d to 1
end if
set lst to {}
repeat with i from m to n by d
set end of lst to i
end repeat
return lst
end enumFromTo
 
-- foldl :: (a -> b -> a) -> a -> [b] -> a
Line 253 ⟶ 264:
set lng to length of xs
repeat with i from 1 to lng
set v to lambda|λ|(v, item i of xs, i, xs)
end repeat
return v
Line 265 ⟶ 276:
set lst to {}
repeat with i from 1 to lng
set end of lst to lambda|λ|(item i of xs, i, xs)
end repeat
return lst
Line 278 ⟶ 289:
else
script
property lambda|λ| : f
end script
end if
end mReturn</lang>
 
-- range :: Int -> Int -> [Int]
on range(m, n)
if n < m then
set d to -1
else
set d to 1
end if
set lst to {}
repeat with i from m to n by d
set end of lst to i
end repeat
return lst
end range</lang>
 
{{Out}}
<lang AppleScript>{{3, 4, 5}, {5, 12, 13}, {6, 8, 10}, {7, 24, 25}, {8, 15, 17}, {9, 12, 15}, {12, 16, 20}, {15, 20, 25}}</lang>
9,659

edits