Szukałem w pewnym kodzie źródłowym Haskell i natknąłem się na meczu wzór z !_
, kod jest tutaj: http://hackage.haskell.org/package/base-4.9.0.0/docs/src/GHC.List.html#unsafeTakeKiedy jest użyteczne użycie "ścisłej wieloznacznej" w Haskell i co ona robi?
take n xs | 0 < n = unsafeTake n xs
| otherwise = []
-- A version of take that takes the whole list if it's given an argument less
-- than 1.
{-# NOINLINE [1] unsafeTake #-}
unsafeTake :: Int -> [a] -> [a]
unsafeTake !_ [] = []
unsafeTake 1 (x: _) = [x]
unsafeTake m (x:xs) = x : unsafeTake (m - 1) xs
I naprawdę nie rozumiem, w jaki sposób „surowe wieloznaczny” działa i dlaczego jest przydatna ta funkcja (lub jakakolwiek inna funkcja).
Przypuszczam, że warto wspomnieć, że jeśli użyje się funkcji 'take' z' undefined' jako argumentu 'n', to jest mało prawdopodobne, aby złapać błąd w funkcji' unsafeTake', ponieważ 'n' jest porównywany z zerem wcześniej, tzn. być wcześniej ocenione. Ale ponieważ funkcja 'take' ma być w jak największym stopniu zorientowana (jak mówi komentarz), to ta kontrola może zniknąć po pewnych optymalizacjach. Dlatego potrzebujemy '! _' również w' unsafeTake'. – Shersh