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
4

2 に答える 2

3

最初の提案は有効な構文なので、そのまま使用してください。

main = print $ case toLower <$> os of
  x | "mingw" `isPrefixOf` x -> "windows"
    | "darwin" == x          -> "mac"
    | otherwise              -> "linux"
于 2014-10-03T07:44:11.483 に答える
0

編集:あなたは何としてもポイントフリーのケースを目指していると思いました. András Kovács が指摘しているように、あなたの的確な提案は確かに正しい構文です。

これは無意味なスタイルのマッチです:

{-# 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")]
于 2014-10-03T07:39:40.120 に答える