Data.Text 常量的模式匹配?

Pattern match on Data.Text constant?

我想我是瞎子之类的,所以我找不到在 Data.Text 常量上进行模式匹配的惯用方法。

基本上,我想做的是:

getTempDriverName dir >>= \case
  "k10temp" -> handleK10Temp dir
  "coretemp.0" -> handleCoreTemp dir
  _ -> fail "Wrong driver"

我想使用 Data.Text,因为 String 是懒惰的,没有人知道文件何时会关闭。但是,显然以下内容不起作用:

getTempDriverName dir >>= \case
  T.pack "k10temp" -> handleK10Temp dir
  T.pack "coretemp.0" -> handleCoreTemp dir
  _ -> fail "Wrong driver"

有什么想法吗?惯用的方式是什么?我当然可以这样做:

getTempDriverName dir >>= \case
  name
    | name == T.pack "k10temp" -> handleK10Temp dir
    | name == T.pack "coretemp.0" -> handleCoreTemp dir
    | otherwise -> fail "Wrong driver"

但它涉及绑定一个我不关心的名称。

如果你真的想在这里进行模式匹配,你可以使用OverloadedStrings extension because Text is an instance of IsString。使用此扩展,字符串的类型为 IsString a => a,就像数字的类型为 Num a => a:

λ> :set -XOverloadedStrings
λ> :t "hello"
"hello" :: IsString a => a
λ> "sample" :: Text
"sample"

在代码中:

-- put this pragma at the top of the file
{-# LANGUAGE OverloadedStrings #-}

getTempDriverName dir >>= \case
  "k10temp" -> handleK10Temp dir
  "coretemp.0" -> handleCoreTemp dir
  _ -> fail "Wrong driver"