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"
我想我是瞎子之类的,所以我找不到在 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"