Chcę tylko wiedzieć, jak wiemy, które funkcje potrzebują wsporników () i które nie? Na przykład

replicate 100 (product (map (*3) (zipWith max [1,2,3,4,5] [4,5,6,7,8])))

Działa w porządku. Ale

replicate 100 (product (map (*3) (zipWith (max [1,2,3,4,5] [4,5,6,7,8]))))

Nie działa. To dlatego, że umieściłem zestaw wsporników na Zipwith. W tym małym przykładzie Zipwith i Max nie mają wsporników, ale replikować, produkt i mapę. Ogólnie rzecz biorąc, jest sposób, aby poznać / dowiedzieć się, które funkcje potrzebują wsporników, a które nie są.

3
Srinivas 17 luty 2017, 15:46

1 odpowiedź

Rodrigo dał właściwą odpowiedź. Dodam, że jest to nieporozumienie, aby myśleć, że niektóre funkcje potrzebują nawiasów, podczas gdy inni nie.

To jest jak w szkole matematyki:

3 * (4+5)

Po prostu nie jest to przypadek, że + wyrażenia potrzebuje nawiasów i wyrażeń {x1}} nie potrzebuje ich ogólnie .

W Haskell zawsze możesz w ogóle uciec bez nawiasów. Za każdym razem, gdy musisz załączyć wyrażenie w nawiasach, alternatywą jest wprowadzenie lokalnej nazwy i wiązania go do tego wyrażenia, a następnie użyj nazwy zamiast wyrażenia.

W twoim przykładzie:

replicate 100 (product (map (*3) (zipWith max [1,2,3,4,5] [4,5,6,7,8])))

let list1 = product list2
    list2 = map thrice list3
    thrice x = x*3
    list3 = zipWith max [1,2,3,4,5] [4,5,6,7,8]
in replicate 100 list1

W rzeczywistości często piszę do góry do góry:

foo x y z = result
  where
   result = ...
   ...

Jednakże, jak wspomniano wcześniej, wyrażenia składające się z zastosowań funkcyjnych mogą być często zapisywane bez nawiasów, wykorzystując (.) i ($) i w takich przypadkach, do góry podejście z góry może być zbyt Głodnie i poniższe byłyby dużo jaśniejsze (ponieważ nie ma hałasu poprzez nowo wprowadzone nazwy):

replicate 100
  . product
  . map (*3)
  $ zipWith max [1..5] [4..8]
4
Ingo 17 luty 2017, 17:01