小编sna*_*nak的帖子

写一个没有case的空case函数

Decision例如,我可以用空盒子写一些不可能的东西,并将其与 一起使用。

{-# LANGUAGE DataKinds, EmptyCase, LambdaCase, TypeOperators #-}

import Data.Type.Equality
import Data.Void

data X = X1 | X2

f :: X1 :~: X2 -> Void
f = \case {}
-- or
-- f x = case x of {}
Run Code Online (Sandbox Code Playgroud)

有没有办法case通过直接模式匹配参数来编写等效项而不使用直接模式匹配?

f :: X1 :~: X2 -> Void
f ???
Run Code Online (Sandbox Code Playgroud)

haskell

6
推荐指数
1
解决办法
271
查看次数

为什么Setter有Traversable约束?

当你查看settingin lens-family-corepackage 时,你会发现它的类型是Identical f => ((a -> b) -> s -> t) -> LensLike f s t a b,并且Identical定义为class (Traversable f, Applicative f) => Identical f

我理解它需要ApplicativeandIdentical因为它使用pureand extract,但我不确定为什么它需要Traversable

setting :: Identical f => ((a -> b) -> s -> t) -> LensLike f s t a b
setting sec f = pure . sec (extract . f)
Run Code Online (Sandbox Code Playgroud)

我还发现Setterlens包中 …

haskell haskell-lens

6
推荐指数
1
解决办法
191
查看次数

Cabal不会更新二进制符号链接

我正在使用OS X 10.8.2和Haskell Platform 2012.4.0.0.使用时更新包时cabal install,二进制符号链接不会更新以指向新的二进制版本.我必须手动删除符号链接并重新安装包.cabal install说:

警告:无法在/ Users/thsoft/Library/Haskell/bin中为elm创建符号链接,因为该文件已存在但不受cabal管理.如果您愿意,可以手动为此可执行文件创建符号链接.可执行文件已安装在/Users/thsoft/Library/Haskell/ghc-7.4.1/lib/Elm-0.7/bin/elm

我尝试使用sudo--symlink-bindir=/Users/thsoft/Library/Haskell/bin明确指定,但没有一个帮助.我怎么能解决这个问题?

haskell cabal cabal-install osx-lion

5
推荐指数
1
解决办法
927
查看次数

Sigma 中的限制类型

我已经按种类X索引了S几个适用于X. 例如,f转换X S1X S2(但X S1在这个简化的示例中不使用)。

{-# LANGUAGE DataKinds, GADTs, TemplateHaskell, TypeFamilies #-}

import Data.Singletons
import Data.Singletons.Sigma
import Data.Singletons.TH

singletons [d|
    data S = S1 | S2 | S3 | S4
  |]

data X (s :: S) = X

f :: X S1 -> X S2
f x = X
Run Code Online (Sandbox Code Playgroud)

现在我想定义可能返回X S2X S3取决于其参数的函数。直接的方法是使用Either.

g1 :: Bool -> X S1 -> Either …
Run Code Online (Sandbox Code Playgroud)

haskell dependent-type singleton-type

5
推荐指数
0
解决办法
93
查看次数

如何使用lens访问sum类型后面的记录字段

我正在尝试使用 Haskell 中的透镜和棱镜访问嵌套记录:

import Data.Text (Text)
import Control.Lens.TH

data State = State
    { _stDone :: Bool
    , _stStep :: StateStep
    }

data StateStep
    = StatePause
    | StateRun
        { _stCounter  :: Int
        , _stMMistake :: Maybe Text
        }

makeLenses ''State
makeLenses ''StateStep
makePrisms ''StateStep

main :: IO ()
main = do
    let st = State False $ StateRun 0 Nothing

    -- works, but the `_2` seems weird
        mMistake = st ^? stStep . _StateStepRun . _2 . _Just

    -- why not …
Run Code Online (Sandbox Code Playgroud)

haskell record lenses haskell-lens

5
推荐指数
1
解决办法
383
查看次数

如何为幻像类型创建实例返回幻像类型?

我们有以下数据类型:

data Foo1 a = Foo1
data Foo2 a = Foo2 (Foo3 a)
data Foo3 a = C1 (Foo1 a) | C2 Int
Run Code Online (Sandbox Code Playgroud)

现在我们希望能够从Foo1或Int获得Foo3.解决方案可以是使用类型类:

class ToFoo3 a where
    toFoo3 :: a -> Foo3 b -- Here start the problems with this phantom type b...

instance ToFoo3 (Foo1 b) where
    toFoo3 foo1 = C1 foo1

instance ToFoo3 Int where
    toFoo3 int = C2 int
Run Code Online (Sandbox Code Playgroud)

在这里,编译器抱怨(正确!)它不能将b与b1匹配,因为类定义中的Foo3的"b"与实例中的Foo1的"b"不同.

有办法解决这个问题吗?

haskell typeclass phantom-types

4
推荐指数
2
解决办法
492
查看次数

为什么 prism _Show 不适用于列表?

如何解释第三个结果?为什么返回的列表为空?

>[Just 1, Just 2, Nothing, Just 3]^..folded._Just
[1,2,3]

>"1"^?_Show::Maybe Int
Just 1

>["1", "2", "x"]^..folded._Show :: [Maybe Int]
[]
Run Code Online (Sandbox Code Playgroud)

_Just_Show是棱镜:

>:t _Just
_Just :: Prism (Maybe a) (Maybe b) a b
>:t _Show
_Show :: (Read a, Show a) => Prism' String a
Run Code Online (Sandbox Code Playgroud)

_Show并不像我预期的那样工作。[Just 1, Just 2]如何用透镜/棱镜得到结果?当然,我可以使用to readMaybe,但我想我可以使用现有的 prism 而不是 helper to

haskell haskell-lens

2
推荐指数
1
解决办法
78
查看次数

这两个符号在Haskell中有何不同?

我是Haskell的新手,仍然对某些符号感到困惑.

在函数头中,我知道

func :: [Int] -> Int
Run Code Online (Sandbox Code Playgroud)

表示输入是整数列表,输出是整数.

这有什么不同

func :: (Ord a) => [a] -> a
Run Code Online (Sandbox Code Playgroud)

我问,因为它们似乎是相同的,我想知道为什么我们使用不同的符号来表示相同的东西.

haskell

0
推荐指数
1
解决办法
71
查看次数

如何返回元组列表的最低值元组?

我有一个带有名称和浮点数的元组列表。如何返回具有最低浮点值的元组?

例子

[("bob",23),("Alice",32),("Susan",1)]

rtnLowestDist :: [(Name, Float)] -> (Name, Float)
Run Code Online (Sandbox Code Playgroud)

返回 ("Susan",1)

haskell

0
推荐指数
1
解决办法
70
查看次数