Advertisement
Arina0904

Практика 9.11

Nov 9th, 2022
1,103
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. type Name = String
  2. type DataBase = [(Name, Name)]
  3.  
  4. fathers :: DataBase
  5. mothers :: DataBase
  6.  
  7. fathers = [("Bill", "John"),("Ann", "John"), ("John", "Piter"),
  8.     ("Jane", "Kan"), ("Dorothy", "Alex"), ("Kan", "Lev"), ("Alice", "Ron"), ("Piter", "Tom")]
  9. mothers = [("Bill", "Jane"), ("Ann", "Jane"), ("John", "Alice"), ("Jane", "Dorothy"),
  10.     ("Alice", "Mary"), ("Piter", "Tona"), ("Dorothy", "Elen"), ("Kan", "Liza")]
  11.    
  12. getM :: Name -> Maybe Name
  13. getM person = lookup person mothers --стрелка Клейсли
  14. getF :: Name -> Maybe Name
  15. getF person = lookup person fathers --стрелка Клейсли
  16.  
  17. --в терминале: do{f <- getF "Bill"; gm <- getMf; getM gm} (то же самое, что и выше)
  18.  
  19. --найдем бабушек по двум линиям
  20. granmas :: Name -> Maybe (Name, Name)
  21. granmas person = do
  22.     m <- getM person
  23.     gmm <- getM m
  24.     f <- getF person
  25.     gmf <- getM f
  26.     return(gmm, gmf)
  27.    
  28. --дедушек по двум линиям
  29. granfath :: Name -> Maybe (Name, Name)
  30. granfath person = do
  31.     m <- getM person
  32.     gfm <- getF m
  33.     f <- getF person
  34.     gff <- getF f
  35.     return(gfm, gff)
  36.  
  37.  
  38. -- class Monad m where
  39. --     return :: a -> m a
  40. --     (>>=) :: m a -> (a -> m b) -> m b
  41. --в терминале: [1,2]>>=(\x -> [x,x,x])
  42. --             [1,1,1,2,2,2]
  43.  
  44. -- instance Monad [] where
  45. --     return x = [x]
  46. --     xs >>= k = concat (map k xs)
  47. --в терминале: map(\x->[x,x,x]) [1,2]
  48. --             [[1,1,1],[2,2,2]]
  49.  
  50. --[1,2]>>=(\x -> [])    
  51. --[]
  52.  
  53. --связь монады списка с генератором списка
  54. list = [(x,y)| x <- [1,2,3], y <- [4,5,6]] --генератор списка
  55.  
  56. list1 = do --генератор списка в do-нотации
  57.     x <- [1,2,3]
  58.     y <- [4,5,6]
  59.     return (x, y)
  60.  
  61. list2 =
  62.     [1,2,3] >>= (\x ->
  63.     [4,5,6] >>= (\y ->
  64.     return (x, y)))
  65.    
  66. --условные вычисления внутри монадических
  67. lst = [(x,y)|x <- [1,2,3], y <- [1,2], x/=y]
  68.  
  69. lst1 = do
  70.     x <- [1,2,3]
  71.     y <- [1,2]
  72.     True <- return (x/=y)
  73.     return (x,y)
  74.    
  75. lst2 =
  76.     [1,2,3] >>= (\x ->
  77.     [1,2] >>= (\y ->
  78.     return (x/=y) >>= (\b -> case b of True -> return (x,y)
  79.                                        _ -> fail "x")))
  80. --написать ф-ю, принимающую число x, которое принимает (a, b, c)
  81. pythT :: Int -> [(Int, Int, Int)]
  82. pythT x = do
  83.     a <- [1..x]
  84.     b <- [1..x]
  85.     c <- [1..x]
  86.     True <- return (a < b)
  87.     True <- return (c <= x)
  88.     True <- return (a*a + b*b == c*c)
  89.     return (a,b,c)
  90.  
  91. --экивалентно
  92. pythT2 x = [(a, b, c)| a <- [1..x], b <- [1..x], c <- [1..x], a < b, c <= x, a*a + b*b == c*c]
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement