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

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

{-# 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 ответа

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

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

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

Вот бессмысленный матч в стиле:

{-# 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")]
Другие вопросы по тегам