0

Почему не случай с предикатными стражами в дополнение к защитным узорам?Почему не случай с предикатными стражами в дополнение к охранникам?

{-# LANGUAGE MultiWayIf, LambdaCase #-} 

module Main where 

import System.Info   (os) 
import Control.Applicative ((<$>)) 
import Data.Char   (toLower) 
import Data.List   (isPrefixOf) 

main :: IO() 
main = print . ($ toLower <$> os) $ \x -> if 
    | "mingw" `isPrefixOf` x -> "windows" 
    | "darwin" == x   -> "mac" 
    | otherwise    -> "linux" 

будет симпатичнее как:

main = print $ case toLower <$> os of 
    x | "mingw" `isPrefixOf` x -> "windows" 
    | "darwin" == x   -> "mac" 
    | otherwise    -> "linux" 

или даже:

main = print $ case toLower <$> os of 
    | ("mingw" `isPrefixOf`) -> "windows" 
    | ("darwin" ==)   -> "mac" 
    | otherwise    -> "linux" -- when pattern absent: otherwise = const True 
+2

Что вы думаете? Вы предлагаете новый синтаксис Haskell? –

+0

да, я так думаю – user1441998

+0

Кажется, разумная идея, но разве это полезно? Я никогда не пропускал эту функцию. – augustss

ответ

0

Edit: Я думал, что вы стремитесь к точечным бесплатно случае любой ценой. Ваше интересное предложение - действительно правильный синтаксис, как указывает Андраш Ковач.

Вот матч бессмысленно-стиль:

{-# LANGUAGE ViewPatterns #-} 
main = print $ case toLower <$> os of 
    (("mingw" `isPrefixOf`) -> True) -> "windows" 
    (("darwin" ==) -> True)   -> "mac" 
    _        -> "linux" 

или даже без шаблонов зрения:

match :: a -> [(a -> Bool, b)] -> b 
match x ((f,y):rest) | f x  = y 
        | otherwise = match x rest 
match _ [] = error "Non exhaustive predicates" 

main = print $ match (toLower <$> os) 
    [(("mingw" `isPrefixOf`) , "windows") 
    ,(("darwin"==)   , "mac") 
    ,((const True)   , "linux")] 
+0

ах, спасибо за пример viewpatterns. я думаю, вопрос в том, «будет ли мое второе предложение вызывать проблемы», - подумал он, и если да, то почему отказался? » – user1441998

+1

@ user1441998 Я не знаю, было ли это рассмотрено, но так как первый вариант - всего несколько символов, это затрудняет добавление второго в качестве другого особого случая в грамматике Haskell. – chi

3

Ваше первое предложение действует синтаксис, так что просто использовать:

main = print $ case toLower <$> os of 
    x | "mingw" `isPrefixOf` x -> "windows" 
    | "darwin" == x   -> "mac" 
    | otherwise    -> "linux" 
+0

ха-ха, кричит, спасибо, что указал. :), но мне нравится pointfree, почему бы не позволить это? – user1441998